Qt中隐藏的样式表、小部件和大小
样式表有一个大问题 如果您通过样式表将最大值和最小值设置为相同(固定大小)或其他方式来设置大小,然后尝试使用小部件上的size()来获取它们,如果小部件从未显示过,则获得的大小会很奇怪。 但是您也不能从样式表中获取它们,因此在调整大小或获取位置之前,您必须显示所有小部件 在我的例子中,我从一个窗口开始。但是此窗口下的小部件将在稍后出现,在出现之前,它们必须定位在正确的位置。我有浮动小部件,它们没有集成为QMainWindow的子项,所以我手动移动它们,并定位它们。。。但是如果我不知道他们是怎样的,我怎么能做到呢Qt中隐藏的样式表、小部件和大小,qt,resize,qt4,stylesheet,qtstylesheets,Qt,Resize,Qt4,Stylesheet,Qtstylesheets,样式表有一个大问题 如果您通过样式表将最大值和最小值设置为相同(固定大小)或其他方式来设置大小,然后尝试使用小部件上的size()来获取它们,如果小部件从未显示过,则获得的大小会很奇怪。 但是您也不能从样式表中获取它们,因此在调整大小或获取位置之前,您必须显示所有小部件 在我的例子中,我从一个窗口开始。但是此窗口下的小部件将在稍后出现,在出现之前,它们必须定位在正确的位置。我有浮动小部件,它们没有集成为QMainWindow的子项,所以我手动移动它们,并定位它们。。。但是如果我不知道他们是怎样的
您知道获取样式表中存储的大小的其他方法吗?到目前为止,我知道三种解决方案:
widget->ensureprolished()
qApp->style()->Polish(小部件)
QCoreApplication::sendPostedEvents(小部件,0)
,然后再显示。对于Qt5,您不需要第二个参数,因为它现在的默认值为0while (widget->d_ptr->postedEvents)
QCoreApplication::sendPostedEvents(widget, 0);
现在可以保证小部件是可见的,并且大小正确sendPostedEvents
返回时,该对象没有更多事件要传递时,才应卸载事件过滤器并处理最新的几何体
以下演示了强制抛光方法,并在Qt 4.8.5和5.2.0下工作。我已经在OS X上的64位构建和Windows上的32位构建上测试了它
请注意,l1
和l2
均未显示,但它们都报告了正确的大小<代码>l3显示,但在显示之前查询时,它会报告错误的大小
#include <QApplication>
#include <QLabel>
#include <QStyle>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString style("QLabel { min-height:100px; max-height:100px; min-width: 300px; max-width:300px }");
a.setStyleSheet(style);
QLabel l1, l2, l3;
l1.ensurePolished(); // equivalent first/second methods
QCoreApplication::sendPostedEvents(&l2, 0); // third method
l3.setText(QString("l1: %1 x %2 l2: %3 x %4 l3: %5 x %6")
.arg(l1.width()).arg(l1.height())
.arg(l2.width()).arg(l2.height())
.arg(l3.width()).arg(l3.height()));
l3.setAlignment(Qt::AlignCenter);
l3.show();
return a.exec();
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QString样式(“QLabel{min-height:100px;max-height:100px;min-width:300px;max-width:300px}”);
a、 设置样式表(样式);
QLabel l1、l2、l3;
l1.ensureProlished();//等效的第一个/第二个方法
QCoreApplication::sendPostedEvents(&l2,0);//第三个方法
l3.setText(QString(“l1:%1 x%2 l2:%3 x%4 l3:%5 x%6”)
.arg(l1.width()).arg(l1.height())
.arg(l2.width()).arg(l2.height())
.arg(l3.width()).arg(l3.height());
l3.设置对齐(Qt::AlignCenter);
l3.show();
返回a.exec();
}
如果解决方案是不带参数的单个方法调用,我想这不是什么大问题:)这可能是文档或PEBKAC的问题,但不是样式表的问题:)样式表文档确实是一个非常糟糕的信息源。对我来说,猜测这些事情有时是一场噩梦。关于那个函数调用,我从来没见过它被写出来。。。在任何地方所以我得看文件,从没看过!让我检查一下。这是什么确切的平台(操作系统、编译器),Qt的确切版本,以及为配置
提供了什么选项?我真的很难复制它。Windows 64位,Visual Studio 2008(哪个编译器?O_O)。Qt4.7.现在,您的问题是一个待关闭的候选问题,因为要么无法复制,要么您没有提供足够的详细信息(如在一个自包含的最小测试用例中显示它不起作用)。如果没有代码可供查看,这里的任何人都无法帮助您。谢谢您的回答。我不知道这个函数。但对我来说不起作用。样式表是在创建UI之前分配的。然后在创建隐藏小部件之后,我输出大小(它是巨大的)。然后我使用这个函数。大小保持不变。然后在显示小部件之后,它会按照样式表的指示变小。不要为我工作。事实上,正如文档所说:“QWidget在完全构建之后,但在第一次显示之前调用这个函数”。因此,默认情况下,它被称为@darkgaze。您误解了文档所说的内容。在这种情况下,Qt可以在两种情况下对小部件执行重要的操作:在构造时,以及在调用show()
时。它是单线程代码,当您调用size()
时,它不会为您做任何事情!因此,该函数只能在调用show()
时调用,但还未使其可见show()
在小部件可见之前执行一系列操作。文档的真正意思是:当你调用show()
时,我们会调用它,但在电子击中屏幕上的荧光粉之前:)@darkgaze好吧,我真的不能为你调试。软件开发中的问题解决需要将其缩小到最小的可重复情况。对你来说,复制项目并开始扔掉不相关的东西应该很容易。它应该是可以工作的,所以你的问题不在这里,而是在代码中的其他地方