gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:05:33 25 4
gpt4 key购买 nike

样式表有一个大问题。

如果您通过样式表通过将最大值和最小值设置为相同(固定大小)或其他方式来设置大小,然后您尝试使用小部件上的 size() 获取它们,如果小部件从未显示过,那么您得到的尺寸很奇怪。

但是你也不能从样式表中获取它们,所以你必须 显示 之前的所有小部件调整大小或获取位置。

就我而言,我从一个窗口开始。但是这个窗口下的小部件稍后会出现,和在出现 之前,它们必须定位在正确的位置.我有 float 小部件,它们没有集成为 QMainWindow 的子级,所以我手动移动它们并定位它们......但是如果我不知道它们是怎么做的,我该怎么做?

你知道任何其他方法来获取存储在样式表中的大小吗?

最佳答案

到目前为止,我知道三种解决方案:

  • 抛光小部件:调用 widget->ensurePolished() .
  • 通过样式打磨小部件:调用qApp->style()->polish(widget) .
  • 发送发布到小部件的事件:QCoreApplication::sendPostedEvents(widget, 0)在小部件显示之前。在 Qt 5 中,您不需要第二个参数,因为它现在的默认值为 0。

  • 您的问题的另一个解决方案是根本不编写任何同步代码。要在第一次显示时布置顶级小部件:
  • 在小部件上安装事件过滤器。
  • 当 show 事件到达小部件时:
  • 从小部件中卸载事件过滤器。
  • 传递所有窗口的事件,直到一个都没有:
    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显示了,但是在显示之前查询时,它报告了错误的大小。

    screenshot
    #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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com