2015-02-24 79 views
4

我有Qt應用程序自定義樣式表應用到它(和所有小部件一般)與自定義字體包括在此樣式表。但是當試圖獲取一些小部件font()方法的字體時會返回不同的字體。我想獲取由樣式表設置的QWidget的字體。 font()方法總是返回全局系統字體或由setFont()設置的字體,但不是由setStyleSheet()設置的字體,用於在窗口小部件中繪畫。我需要字體根據字體大小進行一些計算。我使用Qt 4.6。我怎樣才能得到由樣式表設置的小部件的真正字體(這是顯示應用程序運行時)?如何通過樣式表設置Qt中的窗口小部件的字體?

經過一番調查後,我看到如果我將定義好的樣式表應用到某個小部件上,我可以用myWidget->font()方法得到正確的字體信息(由樣式表定義)。另外,當我將樣式表設置爲整個MainWindow時,我可以通過font()方法爲MainWindow包含的所有小部件獲取適當的字體信息。但是,當我將樣式表設置爲QApplication的實例時,所有窗口小部件的font()方法將返回默認字體或之前由setFont()設置的字體。爲什麼這樣?

+0

您是否在Qt Designer中創建了您的小部件? – DaveyLaser 2015-02-24 18:18:33

+1

我將自定義樣式表設置爲整個應用程序。這個樣式表描述了我的應用程序上幾個小部件的樣式。因此,例如,我爲我的應用程序中的所有QGraphicsView對象設置自定義背景顏色和字體: app.setStyleSheet(「font-family:Arial; font-style:normal; font-size:12pt; font-weight:bold ;「); – vasyl 2015-02-24 21:31:35

+0

你找到了方法嗎? – fAX 2016-03-17 09:40:48

回答

1

從Qt的樣式表加載值,你應該調用此方法:

widget->style()->unpolish(widget); 
widget->style()->polish(widget); 
widget->update(); 

這畢竟您的小部件的值將根據您指定的樣式表值進行更新。

+0

唯一必需的調用是'QWidget :: ensurePolished()'。絕對沒有理由明確重新拋光該部件,也不需要'更新'它。 – 2017-07-31 21:10:43

2

您可以檢索特定窗口部件的字體讀出它的屬性,如下:

//Get pushbutton font. 
QFont font = ui->pushButton->property("font").value<QFont>(); 
qDebug() << font.family() << font.pointSize(); 

//Get MainWindow font. 
QFont font2 = property("font").value<QFont>(); 
qDebug() << font2.family() << font2.pointSize(); 
+1

正如我發現: QFont font = ui-> pushButton-> property(「font」)。value (); and QFont font = ui-> pushButton-> font(); 是相等的。 – vasyl 2015-02-25 11:49:39

+0

該方法對於在用戶點擊CTRL ++或CTRL +時獲取設置的字體大小也很有用 - 可放大/縮小Qt應用程序中的字體。 – 2017-11-28 18:42:06

0

QStyleSheetStyle::updateStyleSheetFont可以看出,這個小部件總是包含樣式表中已解析的字體。我期望QWidget::font()可以返回您使用樣式表設置的解析字體 - 即合併的應用程序字體,任何父窗口小部件字體和樣式表字體。

當然,除非在事件交付後(即從事件循環中)查詢,否則必須首先打磨窗口小部件。

// https://github.com/KubaO/stackoverflown/tree/master/questions/style-font-query-test-45422885 
#include <QtWidgets> 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QLabel label("Test"); 
    auto font1 = label.font(); 
    label.setStyleSheet("font-size: 49pt;"); 
    label.show(); 
    label.ensurePolished(); 
    auto font2 = label.font(); 
    Q_ASSERT(font1.pointSize() != 49); 
    Q_ASSERT(font2.pointSize() == 49); 
    Q_ASSERT(font1.family() == font2.family()); 
} 
相關問題