如何在QWidget中获取样式表更改事件

How to get stylesheet change event in a QWidget?

本文关键字:事件 样式 获取 QWidget      更新时间:2023-10-16

我正在尝试读取所有小部件的全局样式表,并将其应用于QApplication实例。

这将正确地设置所有小部件的样式,除了我不能在主窗口构造函数及其子窗口小部件的构造函数中查询样式选项,如字体和字号,因为此时样式表还没有应用于它。

所以我需要:

  • 要么在主窗口构造函数中提供全局样式表
  • 应用样式表时在小部件中捕获事件

有没有办法做到这一点?

我的主窗口代码如下:

int main(int argc, char **argv)
{   
    QWSServer::QWSServer::setBackground(QBrush(QColor(0, 0, 0, 255)));
    QApplication app(argc, argv);
    QFile stylesheet("/usr/bin/app.qss");
    stylesheet.open(QFile::ReadOnly|QFile::Text);
    QTextStream styleSheetStyle(&stylesheet);
    app.setStyleSheet(styleSheetStyle.readAll());
    MainWindow * pWindow = new MainWindow();
    pWindow->setWindowFlags(Qt::FramelessWindowHint);
    pWindow->show();
    return app.exec();  
}

在小部件中,需要样式的地方:

void paintText(QPixmap *target, const QString &text)
{
    QPainter painter(target);
    painter.setPen(QColor(184,188,193,255));
    painter.setFont(property("font").value<QFont>());
    style()->drawItemText(&painter, 
                         target->rect().adjusted(0,0,0,-15), 
                         Qt::AlignHCenter|Qt::AlignBottom, 
                         QPalette(QColor(184,188,193,255)), 
                         true, 
                         text);
    painter.end();
}

如果在小部件的构造函数中调用了paint函数,那么font是默认的;如果在show事件中调用,那么font就是全局样式表指定的。

但是这个函数只需要调用一次,所以我不想在show事件中绘制它,即使我可以使用标志使它只在第一个show事件中运行。

每次更改样式时,都会调用QWidget::changeEvent()方法。重新实现该方法并检查QEvent::StyleChange事件类型。

void CMyWidget::changeEvent(QEvent* e)
{
    if (e->type() == QEvent::StyleChange)
    {
        // Style has been changed.
    }
    QWidget::changeEvent(e);
}

当事件循环完成时,尝试在小部件构造之后触发paintText。我想那时应该有这种款式。

您可以通过将QTimer::singleshot(0, this, SLOT(paintText()));放入小部件构造函数来实现这一点。

确保paintText()是一个插槽。