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

时间:2016-04-14 15:26:39

标签: c++ qt

我试图读取所有小部件的全局样式表并将其应用于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事件上运行。

2 个答案:

答案 0 :(得分:5)

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

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

    QWidget::changeEvent(e);
}

答案 1 :(得分:0)

尝试在事件循环结束后在窗口小部件构造之后触发paintText。我想应该可以使用这种风格。

您可以完成此操作,但将QTimer::singleshot(0, this, SLOT(paintText()));放在窗口小部件构造函数中。

确保paintText()是SLOT。