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

[复制链接]
4589|94
 楼主| micoccd 发表于 2022-6-13 13:40 | 显示全部楼层
可以执行位置设置背景图片。
  1. QMainWindow > .QWidget {
  2.     background-color: gainsboro;
  3.     background-image: url(:/images/pagefold.png);
  4.     background-position: top right;
  5.     background-repeat: no-repeat
  6. }


 楼主| 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。



 楼主| micoccd 发表于 2022-6-13 15:05 | 显示全部楼层
判断编译器类型、编译器版本、操作系统。
  1. //GCC编译器
  2. #ifdef __GNUC__
  3. #if __GNUC__ >= 3 // GCC3.0以上

  4. //MSVC编译器
  5. #ifdef _MSC_VER
  6. #if _MSC_VER >=1000 // VC++4.0以上
  7. #if _MSC_VER >=1100 // VC++5.0以上
  8. #if _MSC_VER >=1200 // VC++6.0以上
  9. #if _MSC_VER >=1300 // VC2003以上
  10. #if _MSC_VER >=1400 // VC2005以上
  11. #if _MSC_VER >=1500 // VC2008以上
  12. #if _MSC_VER >=1600 // VC2010以上
  13. #if _MSC_VER >=1700 // VC2012以上
  14. #if _MSC_VER >=1800 // VC2013以上
  15. #if _MSC_VER >=1900 // VC2015以上

  16. //Borland C++
  17. #ifdef __BORLANDC__

  18. //Cygwin
  19. #ifdef __CYGWIN__
  20. #ifdef __CYGWIN32__

  21. //mingw
  22. #ifdef __MINGW32__

  23. //windows
  24. #ifdef _WIN32    //32bit
  25. #ifdef _WIN64    //64bit
  26. #ifdef _WINDOWS     //图形界面程序
  27. #ifdef _CONSOLE     //控制台程序
  28. //Windows(95/98/Me/NT/2000/XP/Vista)和Windows CE都定义了
  29. #if (WINVER >= 0x030a)     // Windows 3.1以上
  30. #if (WINVER >= 0x0400)     // Windows 95/NT4.0以上
  31. #if (WINVER >= 0x0410)     // Windows 98以上
  32. #if (WINVER >= 0x0500)     // Windows Me/2000以上
  33. #if (WINVER >= 0x0501)     // Windows XP以上
  34. #if (WINVER >= 0x0600)     // Windows Vista以上
  35. //_WIN32_WINNT 内核版本
  36. #if (_WIN32_WINNT >= 0x0500) // Windows 2000以上
  37. #if (_WIN32_WINNT >= 0x0501) // Windows XP以上
  38. #if (_WIN32_WINNT >= 0x0600) // Windows Vista以上


 楼主| micoccd 发表于 2022-6-13 15:15 | 显示全部楼层
在pro中判断Qt版本及构建套件位数
  1. #打印版本信息
  2. message(qt version: $QT_VERSION)
  3. #判断当前qt版本号
  4. QT_VERSION = $[QT_VERSION]
  5. QT_VERSION = $split(QT_VERSION, ".")
  6. QT_VER_MAJ = $member(QT_VERSION, 0)
  7. QT_VER_MIN = $member(QT_VERSION, 1)
  8. #下面是表示 Qt5.5
  9. greaterThan(QT_VER_MAJ, 4) {
  10. greaterThan(QT_VER_MIN, 4) {
  11. #自己根据需要做一些处理
  12. }
  13. }

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


 楼主| micoccd 发表于 2022-6-13 17:21 | 显示全部楼层
Qt最小化后恢复界面假死冻结,加上代码
  1. void showEvent(QShowEvent *e)
  2. {
  3.     setAttribute(Qt::WA_Mapped);
  4.     QWidget::showEvent(e);
  5. }


 楼主| micoccd 发表于 2022-6-13 17:23 | 显示全部楼层
获取标题栏高度:style()->pixelMetric(QStyle::PM_TitleBarHeight); PM_TitleBarHeight点进去你会发现新大陆。
 楼主| micoccd 发表于 2022-6-13 17:24 | 显示全部楼层

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


 楼主| 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键值,从右侧列表中删除自己的那个程序路径即可。
 楼主| 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。



 楼主| micoccd 发表于 2022-6-13 17:28 | 显示全部楼层
Qt5以后提供了类QScroller直接将控件滚动。
  1. //禁用横向滚动条
  2. ui->listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  3. //禁用纵向滚动条
  4. ui->listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  5. //设置横向按照像素值为单位滚动
  6. ui->listWidget->setHorizontalScrollMode(QListWidget::ScrollPerPixel);
  7. //设置纵向按照像素值为单位滚动
  8. ui->listWidget->setVerticalScrollMode(QListWidget::ScrollPerPixel);
  9. //设置滚动对象以及滚动方式为鼠标左键拉动滚动
  10. QScroller::grabGesture(ui->listWidget, QScroller::LeftMouseButtonGesture);
  11. //还有个QScrollerProperties可以设置滚动的一些参数






 楼主| micoccd 发表于 2022-6-13 17:28 | 显示全部楼层
如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库。
  1. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  2. db.setDatabaseName(":memory:");


 楼主| micoccd 发表于 2022-6-13 17:29 | 显示全部楼层
  • 清空数据表并重置自增ID,sql = truncate table table_name。

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

    1. #include <QChartView>
    2. QT_CHARTS_USE_NAMESPACE
    3. class CustomChart : public QChartView



yangxiaor520 发表于 2022-6-13 19:01 来自手机 | 显示全部楼层
收藏了,谢谢分享。
yangxiaor520 发表于 2022-6-14 08:16 来自手机 | 显示全部楼层
收藏了,谢谢楼主分享。
 楼主| micoccd 发表于 2022-6-14 10:06 | 显示全部楼层
QPushButton左对齐文字,需要设置样式表QPushButton{text-align:left;}


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

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


 楼主| micoccd 发表于 2022-6-14 10:09 | 显示全部楼层
巧妙的用QEventLoop开启事件循环,可以使得很多同步获取返回结果而不阻塞界面。QEventLoop内部新建了线程执行。
  1. QEventLoop loop;
  2. connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  3. loop.exec();


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


 楼主| micoccd 发表于 2022-6-14 11:49 | 显示全部楼层
如果需要指定无边框窗体,但是又需要保留操作系统的边框特性,可以自由拉伸边框,可以使用 setWindowFlags(Qt::CustomizeWindowHint);
 楼主| micoccd 发表于 2022-6-14 11:51 | 显示全部楼层
在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码。
  1. QString content = "测试中文";
  2. QString note = content.toUtf8().toPercentEncoding();


您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部