总结了一份Qt5 的开发经验
时间:2021-09-03 10:10:08
手机看文章
扫描二维码
随时随地手机看文章
[导读]关注、星标公众号,直达精彩内容来源:https://gitee.com/feiyangqingyun当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了。定时器是个好东西,学会好使用它,...
关注、星标公众号,直达精彩内容来源:https://gitee.com/feiyangqingyun
- 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了。
- 定时器是个好东西,学会好使用它,有时候用QTimer::singleShot可以解决意想不到的问题。
- 默认QtCreator是单线程编译,可能设计之初考虑到尽量不过多占用系统资源,而现在的电脑都是多核心的,默认msvc编译器是多线程编译的不需要手动设置,而对于其他编译器,需要手动设置才行。
- 方法一:在每个项目的构建设置中(可以勾选一个shadow build的页面地方)的build步骤,make arguments增加一行 -j16 即可,此设置会保存在pro.user文件中,一旦删除就需要重新设置,不建议此方法;
- 方法二:在构建套件的环境中增加,工具->选项->构建套件(kits)->选中一个构建套件->environment->右侧change按钮->打开的输入框中填入 MAKEFLAGS=-j4 , 这样就可以不用每次设置多线程编译,只要是应用该构件套件的项目都会加上这个编译参数;
- 注意:-j后面接的是电脑的核心数,写多了不会有效果,要自己看下电脑的参数,或者填个-j4就行,毕竟现在电脑4核心应该是最基本的;
- 大概从2019年开始的新版本的QtCreator默认已经会根据电脑的核心自动设置多线程编译,比如识别到你的电脑是16核心的就会默认设置-j16参数进行编译;
- 如果你想顺利用QtCreator部署安卓程序,首先你要在AndroidStudio 里面配置成功,把坑全部趟平。
- 很多时候找到Qt对应封装的方法后,记得多看看该函数的重载,多个参数的,你会发现不一样的世界,有时候会恍然大悟,原来Qt已经帮我们封装好了,比如QString、QColor的重载参数极其丰富。
- 可以在pro文件中写上标记版本号 ico图标(Qt5才支持),其实在windows上就是qmake的时候会自动将此信息转换成rc文件。
VERSION = 2021.10.25
RC_ICONS = main.ico
- 管理员运行程序,限定在MSVC编译器。
QMAKE_LFLAGS = /MANIFESTUAC:"level='requireAdministrator' uiAccess='false'" #以管理员运行
QMAKE_LFLAGS = /SUBSYSTEM:WINDOWS,"5.01" #VS2013 在XP运行
- 运行文件附带调试输出窗口,这个非常有用,很多时候当我们发布程序阶段,我们会遇到程序双击无法运行也不报错提示(开发机器上一切正常),都不知道发生了什么,甚至任务管理器可以看到运行了但是没有界面弹出来,此时就需要在项目的pro文件中加上这个,带界面的程序也会自动弹出调试窗口打印输出信息,方便找问题,一般没法正常运行的程序都会打印一些提示信息缺啥之类的。
TEMPLATE = app
MOC_DIR = temp/moc
RCC_DIR = temp/rcc
UI_DIR = temp/ui
OBJECTS_DIR = temp/obj
#就是下面这行用来设置运行文件附带调试输出窗口
CONFIG = console pro
- 绘制平铺背景QPainter::drawTiledPixmap,绘制圆角矩形QPainter::drawRoundedRect(),而不是QPainter::drawRoundRect();
- 移除旧的样式
//移除原有样式
style()->unpolish(ui->btn);
//必须要有下面这行不然还是不会卸载
ui->btn->setStyleSheet("");
//重新设置新的该控件的样式。
style()->polish(ui->btn);
- 获取类的属性
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i = 0; i < count; i) {
QMetaProperty metaproperty = metaobject->property(i);
const char *name = metaproperty.name();
QVariant value = object->property(name);
qDebug() << name << value;
}
- Qt内置图标封装在QStyle中,大概七十多个图标,可以直接拿来用。
SP_TitleBarMenuButton,
SP_TitleBarMinButton,
SP_TitleBarMaxButton,
SP_TitleBarCloseButton,
SP_MessageBoxInformation,
SP_MessageBoxWarning,
SP_MessageBoxCritical,
SP_MessageBoxQuestion,
...
//下面这样取出来使用就行
QPixmap pixmap = this->style()->standardPixmap(QStyle::SP_TitleBarMenuButton);
ui->label->setPixmap(pixmap);
- 根据操作系统位数判断加载
win32 {
contains(DEFINES, WIN64) {
DESTDIR = $$PWD/../bin64
} else {
DESTDIR = $$PWD/../bin32
}
}
- Qt5增强了很多安全性验证,如果出现setGeometry: Unable to set geometry,请将该控件的可见移到加入布局之后。
- 可以将控件A添加到布局,然后控件B设置该布局,这种灵活性提高了控件的组合度,比如可以在文本框左侧右侧增加一个搜索按钮,按钮设置图标即可。
QPushButton *btn = new QPushButton;
btn->resize(30, ui->lineEdit->height());
QHBoxLayout *layout = new QHBoxLayout(ui->lineEdit);
layout->setMargin(0);
layout->addStretch();
layout->addWidget(btn);
- 对QLCDNumber控件设置样式,需要将QLCDNumber的segmentstyle设置为flat,不然你会发现没效果。
- 巧妙的使用 findChildren 可以查找该控件下的所有子控件。findChild 为查找单个。
//查找指定类名objectName的控件
QList widgets = fatherWidget.findChildren("widgetname");
//查找所有QPushButton
QList allPButtons = fatherWidget.findChildren();
//查找一级子控件,不然会一直遍历所有子控件
QList childButtons = fatherWidget.findChildren(QString(), Qt::FindDirectChildrenOnly);
- 巧妙的使用inherits判断是否属于某种类。
QTimer *timer = new QTimer; // QTimer inherits QObject
timer->inherits("QTimer"); // returns true
timer->inherits("QObject"); // returns true
timer->inherits("QAbstractButton"); // returns false
- 使用弱属性机制,可以存储临时的值用于传递判断。可以通过widget->dynamicPropertyNames()列出所有弱属性名称,然后通过widget->property("name")取出对应的弱属性的值。
- 在开发时, 无论是出于维护的便捷性, 还是节省内存资源的考虑, 都应该有一个 qss 文件来存放所有的样式表, 而不应该将 setStyleSheet 写的到处都是。如果是初学阶段或者测试阶段可以直接UI上右键设置样式表,正式项目还是建议统一到一个qss样式表文件比较好,统一管理。
- 如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可。
- 善于利用QComboBox的addItem的第二个参数设置用户数据,可以实现很多效果,使用itemData取出来。
- 如果用了webengine模块,发布程序的时候带上QtWebEngineProcess.exe translations文件夹 resources文件夹。
- 默认Qt是一个窗体一个句柄,如果要让每个控件都拥有独立的句柄,设置下 a.setAttribute(Qt::AA_NativeWindows);
- Qt Android防止程序被关闭。
#if defined(Q_OS_ANDROID)
QAndroidService a(argc, argv);
return a.exec()
#else
QApplication a(argc, argv);
return a.exec();
#endif
- 可以对整体的指示器设置样式,而不需要单独对每个控件的指示器设置,
*::down-arrow{}
*::menu-indicator{}
*::up-arrow:disabled{}
*::up-arrow:off{}
- 可以指定位置设置背景图片。
QMainWindow > .QWidget {
background-color: gainsboro;
background-image: url(:/images/pagefold.png);
background-position: top right;
background-repeat: no-repeat
}
- 嵌入式linux运行Qt程序 Qt4写法:./HelloQt -qws