打印

一份硬核的QT开发经验及资料分享,长文收藏!

[复制链接]
楼主: micoccd
手机看帖
扫描二维码
随时随地手机跟帖
21
micoccd|  楼主 | 2022-6-13 13:40 | 只看该作者 回帖奖励 |倒序浏览
可以执行位置设置背景图片。
QMainWindow > .QWidget {
    background-color: gainsboro;
    background-image: url(:/images/pagefold.png);
    background-position: top right;
    background-repeat: no-repeat
}


使用特权

评论回复
22
micoccd|  楼主 | 2022-6-13 15:01 | 只看该作者
  • 嵌入式linux运行Qt程序  Qt4写法:./HelloQt -qws &   Qt5写法:./HelloQt --platform xcb

  • Qtcreator软件的配置文件存放在:C:\Users\Administrator\AppData\Roaming\QtProject,有时候如果发现出问题了,将这个文件夹删除后打开creator自动重新生成即可。

  • QMediaPlayer是个壳,依赖本地解码器,视频这块默认基本上就播放个MP4,如果要支持其他格式需要下载k-lite或者LAV Filters安装即可(WIN上,其他系统上自行搜索)。如果需要做功能强劲的播放器,初学者建议用vlc、mpv,终极**用ffmpeg。



使用特权

评论回复
23
micoccd|  楼主 | 2022-6-13 15:05 | 只看该作者
判断编译器类型、编译器版本、操作系统。
//GCC编译器
#ifdef __GNUC__
#if __GNUC__ >= 3 // GCC3.0以上

//MSVC编译器
#ifdef _MSC_VER
#if _MSC_VER >=1000 // VC++4.0以上
#if _MSC_VER >=1100 // VC++5.0以上
#if _MSC_VER >=1200 // VC++6.0以上
#if _MSC_VER >=1300 // VC2003以上
#if _MSC_VER >=1400 // VC2005以上
#if _MSC_VER >=1500 // VC2008以上
#if _MSC_VER >=1600 // VC2010以上
#if _MSC_VER >=1700 // VC2012以上
#if _MSC_VER >=1800 // VC2013以上
#if _MSC_VER >=1900 // VC2015以上

//Borland C++
#ifdef __BORLANDC__

//Cygwin
#ifdef __CYGWIN__
#ifdef __CYGWIN32__

//mingw
#ifdef __MINGW32__

//windows
#ifdef _WIN32    //32bit
#ifdef _WIN64    //64bit
#ifdef _WINDOWS     //图形界面程序
#ifdef _CONSOLE     //控制台程序
//Windows(95/98/Me/NT/2000/XP/Vista)和Windows CE都定义了
#if (WINVER >= 0x030a)     // Windows 3.1以上
#if (WINVER >= 0x0400)     // Windows 95/NT4.0以上
#if (WINVER >= 0x0410)     // Windows 98以上
#if (WINVER >= 0x0500)     // Windows Me/2000以上
#if (WINVER >= 0x0501)     // Windows XP以上
#if (WINVER >= 0x0600)     // Windows Vista以上
//_WIN32_WINNT 内核版本
#if (_WIN32_WINNT >= 0x0500) // Windows 2000以上
#if (_WIN32_WINNT >= 0x0501) // Windows XP以上
#if (_WIN32_WINNT >= 0x0600) // Windows Vista以上


使用特权

评论回复
24
micoccd|  楼主 | 2022-6-13 15:15 | 只看该作者
在pro中判断Qt版本及构建套件位数
#打印版本信息
message(qt version: $QT_VERSION)
#判断当前qt版本号
QT_VERSION = $[QT_VERSION]
QT_VERSION = $split(QT_VERSION, ".")
QT_VER_MAJ = $member(QT_VERSION, 0)
QT_VER_MIN = $member(QT_VERSION, 1)
#下面是表示 Qt5.5
greaterThan(QT_VER_MAJ, 4) {
greaterThan(QT_VER_MIN, 4) {
#自己根据需要做一些处理
}
}

#QT_ARCH是Qt5新增的,在Qt4上没效果
#打印当前Qt构建套件的信息
message($QT_ARCH)
#表示arm平台构建套件
contains(QT_ARCH, arm) {}
#表示32位的构建套件
contains(QT_ARCH, i386) {}
#表示64位的构建套件
contains(QT_ARCH, x86_64) {}


使用特权

评论回复
25
micoccd|  楼主 | 2022-6-13 17:21 | 只看该作者
Qt最小化后恢复界面假死冻结,加上代码
void showEvent(QShowEvent *e)
{
    setAttribute(Qt::WA_Mapped);
    QWidget::showEvent(e);
}


使用特权

评论回复
26
micoccd|  楼主 | 2022-6-13 17:23 | 只看该作者
获取标题栏高度:style()->pixelMetric(QStyle::PM_TitleBarHeight); PM_TitleBarHeight点进去你会发现新大陆。

使用特权

评论回复
27
micoccd|  楼主 | 2022-6-13 17:24 | 只看该作者

设置高分屏属性以便支持2K4K等高分辨率,尤其是手机app。必须写在main函数的QApplication a(argc, argv);的前面。
#if (QT_VERSION > QT_VERSION_CHECK(5,6,0))
    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif


使用特权

评论回复
28
micoccd|  楼主 | 2022-6-13 17:26 | 只看该作者
如果运行程序出现 Fault tolerant heap shim applied to current process. This is usually due to previous crashes. 错误。办法:打开注册表,找到HKEY_LOCAL_MACHINE\Software\Microsoft\Windows  NT\CurrentVersion\AppCompatFlags\Layers\,选中Layers键值,从右侧列表中删除自己的那个程序路径即可。

使用特权

评论回复
29
micoccd|  楼主 | 2022-6-13 17:27 | 只看该作者
  • Qt内置了QFormLayout表单布局用于自动生成标签+输入框的组合的表单界面。

  • qml播放视频在linux需要安装 sudo apt-get install libpulse-dev。

  • 可以直接继承QSqlQueryModel实现自定义的QueryModel,比如某一列字体颜色,占位符,其他样式等,重写QVariant CustomSqlModel::data(const QModelIndex &index, int role) const。



使用特权

评论回复
30
micoccd|  楼主 | 2022-6-13 17:28 | 只看该作者
Qt5以后提供了类QScroller直接将控件滚动。
//禁用横向滚动条
ui->listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//禁用纵向滚动条
ui->listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//设置横向按照像素值为单位滚动
ui->listWidget->setHorizontalScrollMode(QListWidget::ScrollPerPixel);
//设置纵向按照像素值为单位滚动
ui->listWidget->setVerticalScrollMode(QListWidget::ScrollPerPixel);
//设置滚动对象以及滚动方式为鼠标左键拉动滚动
QScroller::grabGesture(ui->listWidget, QScroller::LeftMouseButtonGesture);
//还有个QScrollerProperties可以设置滚动的一些参数






使用特权

评论回复
31
micoccd|  楼主 | 2022-6-13 17:28 | 只看该作者
如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库。
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");


使用特权

评论回复
32
micoccd|  楼主 | 2022-6-13 17:29 | 只看该作者
  • 清空数据表并重置自增ID,sql = truncate table table_name。

  • Qtchart模块从Qt5.7开始自带,最低编译要求Qt5.4。在安装的时候记得勾选,默认不勾选。使用该模块需要引入命名空间。

    #include <QChartView>
    QT_CHARTS_USE_NAMESPACE
    class CustomChart : public QChartView



使用特权

评论回复
33
yangxiaor520| | 2022-6-13 19:01 | 只看该作者
收藏了,谢谢分享。

使用特权

评论回复
34
yangxiaor520| | 2022-6-14 08:16 | 只看该作者
收藏了,谢谢楼主分享。

使用特权

评论回复
35
micoccd|  楼主 | 2022-6-14 10:06 | 只看该作者
QPushButton左对齐文字,需要设置样式表QPushButton{text-align:left;}


QLabel有三种设置文本的方法,掌握好Qt的属性系统,举一反三,可以做出很多效果。

ui->label->setStyleSheet("qproperty-text:hello;");
ui->label->setProperty("text", "hello");
ui->label->setText("hello");


使用特权

评论回复
36
micoccd|  楼主 | 2022-6-14 10:09 | 只看该作者
巧妙的用QEventLoop开启事件循环,可以使得很多同步获取返回结果而不阻塞界面。QEventLoop内部新建了线程执行。
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();


使用特权

评论回复
37
micoccd|  楼主 | 2022-6-14 10:12 | 只看该作者
多种预定义变量 #if (defined webkit) || (defined webengine),去掉生成空的debug和release目录 CONFIG -= debug_and_release。

新版的Qtcreator增强了语法检查,会弹出很多警告提示等,可以在插件列表中关闭clang打头的几个即可,Help》About Plugins。也可以设置代码检查级别,Tools》Options 》C++ 》Code Model。

使用特权

评论回复
38
micoccd|  楼主 | 2022-6-14 10:24 | 只看该作者
QSqlTableModel的rowCount方法,默认最大返回256,如果超过256,可以将表格拉到底部,会自动加载剩余的,每次最大加载256条数据,如果需要打印或者导出数据,记得最好采用sql语句去查询,而不是使用QSqlTableModel的rowCount方法。不然永远最大只会导出256条数据。如果数据量很小,也可以采用如下方法:
//主动加载所有数据,不然获取到的行数<=256
while(model->canFetchMore()) {
    model->fetchMore();
}


使用特权

评论回复
39
micoccd|  楼主 | 2022-6-14 11:49 | 只看该作者
如果需要指定无边框窗体,但是又需要保留操作系统的边框特性,可以自由拉伸边框,可以使用 setWindowFlags(Qt::CustomizeWindowHint);

使用特权

评论回复
40
micoccd|  楼主 | 2022-6-14 11:51 | 只看该作者
在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码。
QString content = "测试中文";
QString note = content.toUtf8().toPercentEncoding();


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则