2016-04-14 47 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。