Qt遇到常见问题记录
1.Qt版本选择
Qt4.8.7是Qt4的终结版本,是Qt4系列版本中最稳定最经典的
(很多嵌入式板子还是用Qt4.8),其实该版本是和Qt5.5差不多时间发布的。
参考链接
Qt 5.5 Released
Qt5.6.3最最后支持xp系统的长期支持版本,Qt5.7.0是最后支持xp系统的非长期支持版本。
Qt5.12.3是最后提供mysql数据库插件的版本,往后的版本需要自行编译对应的mysql数据库插件,官方安装包不再提供。
Qt5.12.5是最后样式表性能最高的版本,经过酷码大佬查阅代码发现此后版本的样式表源码中为了修复一个bug做了循环嵌套设置,导致性能急剧下降,界面越多性能暴降10倍以上。
Qt5.14.2是最后提供二进制安装包的版本,后面的版本都需要在线安装。
Qt5.15系列是最后支持win7的版本,Qt6系列版本需要更改源码编译才能支持,这对于小白来说难于上青天。
如上,因用户使用Win7,并开发机属于离线工作模式,故选择5.14.2(含)之前版本作为IDE开发工具,性能方面,考虑5.12.5
2. Qt QButtonGroup addButton添加后规律
如果默认不指定id,则默认id从 -2 开始计数,依次递减
可通过-(id+2)转为0-base的下标进行访问
3. Qt Connect接lamda实现
通常使用不挂接slot的lamda方式,可以忽略SIGNAL、SLOT及形参的使用,达到高内聚的要求。如:
connect( button_circle, &QPushButton::toggled, this, [=](bool checked)
{
// todo
});
但是当遇到存在多个同名信号,如QButtonGroup的buttonClicked信号,
void buttonClicked(QAbstractButton *);
void buttonClicked(int);
则需要进行类型转换
connect(group, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), this, [=](int id)
{
});
4. QWidget的QSS背景色设置失效
试图重用某一块UI界面,通常做法会从QWidget派生出一个子类,将这部分局部功能进行封装。引入全局QSS,或直接构造时setStyleSheet,直接使用QWidget,正常。
一旦派生子类,则出现背景色设置失效的情况。
原因:Qt官方解释:Qt Style Sheets Reference | Qt Widgets 5.15.15
Supports only the background, background-clip and background-origin properties.
If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
void CustomWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); }
The above code is a no-operation if there is no stylesheet set.
解决方法:
方法1: 听话,重载paintEvent
方法2: 内叠一个QWidget,用它设置背景色
方法3: 改祖,从QFrame派生
方法4: setAttribute(Qt::WA_StyledBackground)