Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过样式表获取Qt中控件的字体?_C++_Qt_Fonts_Qtstylesheets - Fatal编程技术网

C++ 如何通过样式表获取Qt中控件的字体?

C++ 如何通过样式表获取Qt中控件的字体?,c++,qt,fonts,qtstylesheets,C++,Qt,Fonts,Qtstylesheets,我有一个Qt应用程序,它应用了自定义样式表(一般来说,对于所有的小部件),并且在这个样式表中包含了自定义字体。但是当尝试获取某个小部件的字体时,font()方法返回不同的字体。我想获得由样式表设置的QWidget的字体。font()方法始终返回全局系统字体或由setFont()设置的字体,但不返回由setStyleSheet()设置并用于在小部件中绘制的字体。我需要的字体做一些计算的基础上的字体大小。我使用qt4.6。如何获得样式表设置的小部件的真实字体(即应用程序运行时显示的字体) 经过一些调

我有一个Qt应用程序,它应用了自定义样式表(一般来说,对于所有的小部件),并且在这个样式表中包含了自定义字体。但是当尝试获取某个小部件的字体时,
font()
方法返回不同的字体。我想获得由样式表设置的
QWidget
的字体。
font()
方法始终返回全局系统字体或由
setFont()
设置的字体,但不返回由
setStyleSheet()
设置并用于在小部件中绘制的字体。我需要的字体做一些计算的基础上的字体大小。我使用qt4.6。如何获得样式表设置的小部件的真实字体(即应用程序运行时显示的字体)


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

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

//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->按钮->属性(“字体”).value();

qDebug()要从Qt样式表加载值,应调用以下方法:

widget->style()->unpolish(widget);
widget->style()->polish(widget);
widget->update();
在此之后,小部件的所有值都将根据指定的样式表值进行更新。

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

当然,必须首先对小部件进行抛光,除非您在事件交付后(即从事件循环中)进行查询

//https://github.com/KubaO/stackoverflown/tree/master/questions/style-font-query-test-45422885
#包括
int main(int argc,字符**argv){
QApplication app{argc,argv};
QLabel标签(“测试”);
auto font1=label.font();
label.setStyleSheet(“字体大小:49pt;”);
label.show();
标签。确保重新抛光();
auto font2=label.font();
Q_断言(font1.pointSize()!=49);
Q_断言(font2.pointSize()=49);
Q_断言(font1.family()==font2.family());
}

您是否在Qt Designer中创建小部件?我将自定义样式表设置为整个应用程序。这个样式表描述了我的应用程序上几个小部件的样式。因此,例如,我为我的应用程序中的所有QGraphicsView对象设置自定义背景色和字体:app.setStyleSheet(“字体系列:Arial;字体样式:normal;字体大小:12pt;字体重量:bold;”);你找到方法了吗?一般来说,没有。我可以使用
setFont()
方法为某些小部件设置与样式表相同的字体。在此之后,我可以得到这个字体,并作出所有必要的计算。但是我需要确保使用样式表设置的字体和使用
setFont()
方法设置的字体是相同的。这种方法需要一些额外的同步;和QFont font=ui->按钮->字体();当用户点击CTRL++或CTRL+-以放大/缩小Qt应用程序中的字体时,该方法对于设置字体大小也很有用。唯一需要的调用是
QWidget::EnsureResolished()
。绝对没有理由显式地重新修饰小部件,也没有理由更新它。
// 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());
}