2016-04-14 16 views
0

我想读取所有小部件的全局样式表并将其应用于QApplication实例。如何获取QWidget中的样式表更改事件?

这样做可以正确设置所有窗口小部件,但我无法在主窗口构造函数及其子窗口构件的构造函数中查询样式选项,如字体和字体大小,因为此时样式表尚未应用到它。

所以我需要:

  • 要么使在主窗口的构造函数可用的全局样式表;
  • 当样式表应用时,捕获小部件中的事件。

有没有办法实现其中之一?

我的主窗口代码如下:

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(); 
} 

如果涂料函数被调用控件的构造函数,然后字体默认情况下,如果在show事件中调用,则font是由全局样式表指定的字体。

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

回答

5

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

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

    QWidget::changeEvent(e); 
} 
0

尝试在事件循环结束时在构件构建后触发paintText。我想象风格应该是可用的。

你可以做到这一点,但QTimer::singleshot(0, this, SLOT(paintText()));在小部件的构造函数。

确保paintText()是一个SLOT。