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即可。
使用layout的setContentsMargins(0, 0, 0, 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(); 
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐