Qt开发经验小技巧合集

当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了。

定时器是个好东西,学会好使用它,有时候用QTimer::singleShot可以解决意想不到的问题。

打开creator,在构建套件的环境中增加MAKEFLAGS=-j4(具体要看电脑的线程数量,现在很多电脑已经是16线程了就可以写成-j16),可以不用每次设置多线程编译。珍爱时间和生命。新版的QtCreator已经默认就是j4。

如果你想顺利用QtCreator部署安卓程序,首先你要在AndroidStudio 里面配置成功,把坑全部趟平。

很多时候找到Qt对应封装的方法后,记得多看看该函数的重载,多个参数的,你会发现不一样的世界,有时候会恍然大悟,原来Qt已经帮我们封装好了。

可以在pro文件中写上标记版本号+ico图标(Qt5才支持)

VERSION = 2020.10.25 RC_ICONS = main0.ico

管理员运行程序,限定在MSVC编译器。

QMAKE_LFLAGS += /MANIFESTUAC:"level=\'requireAdministrator\' uiAccess=\'false\'" #以管理员运行 QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,"5.01" #VS2013 在XP运行

运行文件附带调试输出窗口
CONFIG += console pro

绘制平铺背景QPainter::drawTiledPixmap,绘制圆角矩形QPainter::drawRoundedRect(),而不是QPainter::drawRoundRect();

移除旧的样式

//移除原有样式 style()->unpolish(ui->btn); //重新设置新的该控件的样式。 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, ...

根据操作系统位数判断加载

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<QWidget *> widgets = fatherWidget.findChildren<QWidget *>("widgetname"); //查找所有QPushButton QList<QPushButton *> allPButtons = fatherWidget.findChildren<QPushButton *>(); //查找一级子控件,不然会一直遍历所有子控件 QList<QPushButton *> childButtons = fatherWidget.findChildren<QPushButton *>(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{}。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxjpf.html