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

Posted

技术标签:

【中文标题】如何获取样式表设置的Qt中小部件的字体?【英文标题】:How to get font of widget in Qt set by stylesheet? 【发布时间】:2015-04-26 11:02:59 【问题描述】:

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

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

【问题讨论】:

你是在 Qt Designer 中创建你的小部件吗? 我将自定义样式表设置为整个应用程序。此样式表描述了我的应用程序上几个小部件的样式。因此,例如,我在我的应用程序中为所有 QGraphicsView 对象设置自定义背景颜色和字体: app.setStyleSheet("font-family: Arial;font-style: normal;font-size: 12pt;font-weight: bold;" ); 找到路了吗? 一般来说,没有。我可以使用setFont() 方法为我在样式表中设置的某些小部件设置相同的字体。在此之后,我可以得到这个字体并进行所有需要的计算。但我需要确保使用样式表设置的字体和使用setFont() 方法设置的字体是相同的。这种方法需要一些额外的同步。 【参考方案1】:

您可以通过读取它的属性来检索特定小部件的字体,如下所示:

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

【讨论】:

我发现:QFont font = ui->pushButton->property("font").value();和 QFont 字体 = ui->pushButton->font();是平等的。 当用户按下 CTRL++ 或 CTRL+- 来放大/缩小 Qt 应用程序中的字体时,该方法对于设置字体大小也很有用。【参考方案2】:

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

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

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

【讨论】:

唯一必要的电话是QWidget::ensurePolished()。绝对没有理由明确地重新抛光小部件,也没有理由 update 它。【参考方案3】:

我可以从QStyleSheetStyle::updateStyleSheetFont 中看出最好的情况,小部件始终包含样式表中已解析的字体。我希望 QWidget::font() 返回您使用样式表设置的解析字体 - 即作为合并应用程序字体的字体、任何父窗口小部件字体和样式表字体。

当然,必须先完善小部件,除非您在事件已交付后进行查询(即从事件循环中)。

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

int main(int argc, char ** argv) 
   QApplication appargc, 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中小部件的字体?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 中的样式表、隐藏的小部件和大小

如何创建自己的使用 qss 的 qt 小部件

Qt如何使用表格?(三)

如何在 Qt 中获取应用程序字体颜色

Qt:: 如何消除 qmainwindow 中小部件和工具栏之间的间隙

布局中小部件的哪个样式表选择器?