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

标签 qt resize qt4 stylesheet qtstylesheets

样式表有一个大问题。

如果您通过样式表通过将最大值和最小值设置为相同(固定大小)或其他方式来设置大小,然后您尝试使用小部件上的 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/

    相关文章:

    c++ - 如何在 QT 中设置中央小部件的大小/位置

    qt - QCheckBox:如何区分用户引起的状态更改和以编程方式进行的更改?

    c++ - 从 C++ 访问 MySQL 数据库

    qt - qtcreator 与 cmake 存储在哪里运行和build设置,以及如何通过脚本设置?

    cocoa - 如何在 COCOA (OS X) 中根据 customView 的大小调整窗口大小?

    c++ - Qt Creator 仅显示 android 作为可用工具包

    asp.net - 适用于 ASP.NET 的图像调整器

    qt - 以本地化格式显示月份和日期

    c++ - QAbstractItemModel 动态项目插入

    c++ - 使用 Qdom 忽略无效的 XML 标签?