样式表有一个大问题。
如果您通过样式表通过将最大值和最小值设置为相同(固定大小)或其他方式来设置大小,然后您尝试使用小部件上的 size() 获取它们,如果小部件从未显示过,那么您得到的尺寸很奇怪。
但是你也不能从样式表中获取它们,所以你必须 显示 之前的所有小部件调整大小或获取位置。
就我而言,我从一个窗口开始。但是这个窗口下的小部件稍后会出现,和在出现 之前,它们必须定位在正确的位置.我有 float 小部件,它们没有集成为 QMainWindow 的子级,所以我手动移动它们并定位它们......但是如果我不知道它们是怎么做的,我该怎么做?
你知道任何其他方法来获取存储在样式表中的大小吗?
最佳答案
到目前为止,我知道三种解决方案:
widget->ensurePolished()
. qApp->style()->polish(widget)
. QCoreApplication::sendPostedEvents(widget, 0)
在小部件显示之前。在 Qt 5 中,您不需要第二个参数,因为它现在的默认值为 0。您的问题的另一个解决方案是根本不编写任何同步代码。要在第一次显示时布置顶级小部件:
while (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();
}
关于qt - Qt 中的样式表、隐藏的小部件和大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21316514/