如何获取样式表设置的Qt中小部件的字体?
How to get font of widget in Qt set by stylesheet?
我有 Qt 应用程序,它应用了自定义样式表(以及所有一般的小部件),该样式表中包含自定义字体。但是当尝试获取某些小部件的字体时 font()
方法 return 不同的字体。我想获取由样式表设置的 QWidget
的字体。 font()
方法总是return全局系统字体或setFont()
设置的字体,而不是setStyleSheet()
设置的用于在widget中绘制的字体.我需要字体根据字体大小进行一些计算。我使用 Qt 4.6。如何获得由样式表设置的小部件的真实字体(即在应用程序 运行 时显示)?
经过一些调查,我发现如果我将定义的样式表应用于某些小部件,我可以使用 myWidget->font()
方法获得正确的字体信息(由样式表定义)。此外,当我将样式表设置为整个 MainWindow
时,我可以使用 font()
方法为 MainWindow
包含的所有小部件获取正确的字体信息。但是,当我将样式表设置为 QApplication
的实例时,所有小部件 return 默认字体或先前由 setFont()
设置的字体的 font()
方法。为什么会这样?
您可以通过读取其属性来检索特定小部件的字体,如下所示:
//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();
要从 Qt 样式表加载值,您应该调用此方法:
widget->style()->unpolish(widget);
widget->style()->polish(widget);
widget->update();
在此之后,您的小部件的所有值都将根据您指定的样式表值进行更新。
我从 QStyleSheetStyle::updateStyleSheetFont 可以看出的最好的信息是,小部件始终包含样式表中解析的字体。我希望 QWidget::font()
到 return 您使用样式表设置的已解析字体 - 即合并应用程序字体的字体、任何父小部件字体和样式表字体。
当然,必须首先完善小部件,除非您在事件传递后进行查询(即从事件循环内进行查询)。
// https://github.com/KubaO/Whosebugn/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());
}
我有 Qt 应用程序,它应用了自定义样式表(以及所有一般的小部件),该样式表中包含自定义字体。但是当尝试获取某些小部件的字体时 font()
方法 return 不同的字体。我想获取由样式表设置的 QWidget
的字体。 font()
方法总是return全局系统字体或setFont()
设置的字体,而不是setStyleSheet()
设置的用于在widget中绘制的字体.我需要字体根据字体大小进行一些计算。我使用 Qt 4.6。如何获得由样式表设置的小部件的真实字体(即在应用程序 运行 时显示)?
经过一些调查,我发现如果我将定义的样式表应用于某些小部件,我可以使用 myWidget->font()
方法获得正确的字体信息(由样式表定义)。此外,当我将样式表设置为整个 MainWindow
时,我可以使用 font()
方法为 MainWindow
包含的所有小部件获取正确的字体信息。但是,当我将样式表设置为 QApplication
的实例时,所有小部件 return 默认字体或先前由 setFont()
设置的字体的 font()
方法。为什么会这样?
您可以通过读取其属性来检索特定小部件的字体,如下所示:
//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();
要从 Qt 样式表加载值,您应该调用此方法:
widget->style()->unpolish(widget);
widget->style()->polish(widget);
widget->update();
在此之后,您的小部件的所有值都将根据您指定的样式表值进行更新。
我从 QStyleSheetStyle::updateStyleSheetFont 可以看出的最好的信息是,小部件始终包含样式表中解析的字体。我希望 QWidget::font()
到 return 您使用样式表设置的已解析字体 - 即合并应用程序字体的字体、任何父小部件字体和样式表字体。
当然,必须首先完善小部件,除非您在事件传递后进行查询(即从事件循环内进行查询)。
// https://github.com/KubaO/Whosebugn/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());
}