dar*_*aze 4 qt resize qt4 stylesheet qtstylesheets
样式表存在很大问题.
如果通过样式表设置大小,方法是将max和min值设置为相同(固定大小)或其他,然后尝试使用widget上的size()获取它们,如果小部件从未显示过您获得的大小很奇怪
但是您也无法从样式表中获取它们,因此您必须在调整大小或获取位置之前显示所有小部件.
就我而言,我从一个窗口开始.但是此窗口下的小部件将在稍后出现,并且必须在出现之前定位在正确的位置.我有漂浮的小部件,它们没有作为QMainWindow的孩子集成,所以我用手移动它们并定位它们......但是如果我不知道它们是怎么做的我该怎么办呢?
你知道其他任何方法来获取样式表中存储的大小吗?
到目前为止,我知道有三种解决方案:
打磨小部件:打电话widget->ensurePolished().
通过样式打磨小部件:调用qApp->style()->polish(widget).
发送发布到窗口小部件的事件:QCoreApplication::sendPostedEvents(widget, 0)在窗口小部件显示之前.使用Qt 5,您不需要第二个参数,因为它现在具有默认值0.
解决问题的另一个方法就是根本不编写任何同步代码.在首次显示时放置顶级窗口小部件:
在窗口小部件上安装事件过滤器.
当show事件到达窗口小部件时:
从窗口小部件卸载事件过滤器.
交付所有窗口的事件,直到没有剩下:
while (widget->d_ptr->postedEvents)
QCoreApplication::sendPostedEvents(widget, 0);
Run Code Online (Sandbox Code Playgroud)
您现在可以确保窗口小部件可见并且大小正确.
使用小部件的几何体并移动它.如果您需要来自所有小部件的信息来做出决定,请将其存储在某些数据结构中,并仅在所有小部件都存在时对其进行处理.
如果您希望防止窗口小部件在错误位置的临时可见性,您可能希望代替调整大小事件.布局和样式系统将适当调整顶级窗口小部件的大小以适应其内容.只有在从调用返回时没有更多要为该对象传递的事件时,才应卸载事件过滤器并处理最新的几何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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2598 次 |
| 最近记录: |