21. Qt 疑难杂症
1. 从QWidget继承的自定义控件,默认不支持样式表,参考如下链接https://blog.csdn.net/qq_31073871/article/details/131351944
1. 从QWidget继承的自定义控件,默认不支持样式表,参考如下链接
https://blog.csdn.net/qq_31073871/article/details/131351944
注意:在painterEvent中需要先设置drawPrimitive使样式表生效,在用painter绘制其他内容,否则在drawPrimitive设置前绘制的内容都会被样式表的设置覆盖掉,也就是之前绘制的内容显示可能会被例如样式表中的背景色设置,全部覆盖掉
2. 报警告:QPainter::begin: Painter already active
如下paintEvent代码实现运行时,会报警告:QPainter::begin: Painter already active,意思是painter已经在运行中了。
修改方法见注释
void paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter p(this); //使用此构造函数,函数内部已经对this执行begin了
p.begin(this); //上面构造函数内部已执行begin,这里再次执行,就会报警告,删掉此行即可
p.setPen(Qt::NoPen);
p.setBrush(QBrush(QColor(color)));
p.setRenderHint(QPainter::Antialiasing, true);
int r = width() > height() ? height() : width();
p.drawEllipse(0, 0, r, r);
p.end(); //上面删掉begin后,这里也删,由构造函数begin时,析构函数会自动end()
};
3. 在重写的event函数中创建控件不显示
起因:想在点击鼠标时,动态创建一个按钮,发现在mousePressEvent中创建后不显示,但是如果在窗口的构造函数中创建就能显示。
但是在构造函数和mousePressEvent分别打印两个按钮的Visible状态,都是false(不显示),那为什么构造函数中的是false也能显示出来呢?
不显示代码如下:
BombClickWidget::BombClickWidget(QWidget *parent) : QWidget(parent)
{
button1 = new QPushButton(this); //在构造函数中创建正常显示
button1->setGeometry(0,0,50,50);
qDebug()<<"create: " << button1->isVisible(); //false不显示
}
void mousePressEvent(QMouseEvent *event)
{
QPushButton* button2 = new QPushButton(this); //在此点击函数中动态创建不能显示
button2->setGeometry(0,0,50,50);
qDebug()<<"mousePressEvent: " << button2->isVisible(); //false不显示
}
修改在mousePressEvent中也打印button1的visible状态,发现是true。由此说明在构造函数中创建控件其实也是not visible,但是外部调用父窗口的show()时,也把当时父窗口上的子控件都显示出来了
void mousePressEvent(QMouseEvent *event)
{
QPushButton* button2 = new QPushButton(this); //在此点击函数中动态创建不能显示
button2->setGeometry(0,0,50,50);
qDebug()<<"button1: " << button1->isVisible(); //button1的状态是true,显示
qDebug()<<"mousePressEvent: " << button2->isVisible(); //false不显示
button2->show(); //调用show就可以显示了
}
原理:
如下图中,QWidget::setVisible()注释所描述,widget不可见有三种情况:
1)被作为独立窗口创建
2)被作为可见窗口的子控件创建
3)调用了hide()或setVisible()
所以,除了在窗口构造函数中创建的控件不需要手动调用show(),其他函数中创建的控件都需要手动调用show()才能显示。
4. border-image和background-image区别(设置圆角图片)

使用border-image设置图片,会使图片限制在border内,当给border设置了圆角时,图片也会裁成圆角显示!
setStyleSheet("border-image:url(./icon.jepg); border-radius:5px;");

5. 使用layout布局,布局后边缘会有空白间隙
原因:QLayout的外边距默认是11像素,把外边距设为0即可。
6. QLabeL设置adjustSize无效
需要先通过stylesheet或font设置好字体配置,然后在调用adjustSize,adjustSize里应该会根据字体配置去计算控件大小。
例如如下先设置adjustSize在设置字体是不对的:
lbUserName = new QLabel(this);
lbUserName->setText("hello");
lbUserName->adjustSize(); //应该设置完字体在调用
lbUserName->setStyleSheet("font-family: Adobe 明體 Std L;"
"font-size: 14px;"
"color: #d1d1d1;");
如下先设置字体在调用adjustSize是对的:
lbUserName = new QLabel(this);
lbUserName->setText("hello");
lbUserName->setStyleSheet("font-family: Adobe 明體 Std L;"
"font-size: 14px;"
"color: #d1d1d1;");
lbUserName->adjustSize();
更多推荐



所有评论(0)