如何在样式表中设置Qt设置的小部件字体?

时间:2015-02-24 17:26:14

标签: c++ qt fonts qtstylesheets

我有Qt应用程序,其中应用了自定义样式表(对于所有小部件),此样式表中包含自定义字体。但是当试图获取某个小部件font()方法的字体时返回不同的字体。我想获得由样式表设置的QWidget字体。 font()方法始终返回全局系统字体或setFont()设置的字体,但不返回setStyleSheet()设置的字体,用于在窗口小部件中绘制。我需要字体根据字体大小进行一些计算。我使用Qt 4.6。如何获得由样式表设置的小部件(在应用程序运行时显示)的真实字体?

经过一些调查后,我看到如果我将定义的样式表应用于某个小部件,我可以使用myWidget->font()方法获得正确的字体信息(由样式表定义)。此外,当我将样式表设置为整个MainWindow时,我可以使用font()方法为MainWindow包含的所有窗口小部件获取正确的字体信息。但是,当我将样式表设置为QApplication的实例时,所有窗口小部件的font()方法都会返回默认字体或先前由setFont()设置的字体。为什么这样?

3 个答案:

答案 0 :(得分: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 :(得分:1)

要从Qt样式表加载值,您应该调用此方法:

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

在此之后,您的小部件的所有值都将根据指定的样式表值进行更新。

答案 2 :(得分:1)

我可以从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());
}