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

Qt中隐藏的样式表、小部件和大小,qt,resize,qt4,stylesheet,qtstylesheets,Qt,Resize,Qt4,Stylesheet,Qtstylesheets,样式表有一个大问题 如果您通过样式表将最大值和最小值设置为相同(固定大小)或其他方式来设置大小,然后尝试使用小部件上的size()来获取它们,如果小部件从未显示过,则获得的大小会很奇怪。 但是您也不能从样式表中获取它们,因此在调整大小或获取位置之前,您必须显示所有小部件 在我的例子中,我从一个窗口开始。但是此窗口下的小部件将在稍后出现,在出现之前,它们必须定位在正确的位置。我有浮动小部件,它们没有集成为QMainWindow的子项,所以我手动移动它们,并定位它们。。。但是如果我不知道他们是怎样的

样式表有一个大问题

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

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

在我的例子中,我从一个窗口开始。但是此窗口下的小部件将在稍后出现,在出现之前,它们必须定位在正确的位置。我有浮动小部件,它们没有集成为QMainWindow的子项,所以我手动移动它们,并定位它们。。。但是如果我不知道他们是怎样的,我怎么能做到呢


您知道获取样式表中存储的大小的其他方法吗?

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

  • 抛光小部件:调用
    widget->ensureprolished()

  • 通过样式来修饰小部件:call
    qApp->style()->Polish(小部件)

  • 将发布的事件发送到小部件:
    QCoreApplication::sendPostedEvents(小部件,0)
    ,然后再显示。对于Qt5,您不需要第二个参数,因为它现在的默认值为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();
    }
    

    #包括
    #包括
    #包括
    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好吧,我真的不能为你调试。软件开发中的问题解决需要将其缩小到最小的可重复情况。对你来说,复制项目并开始扔掉不相关的东西应该很容易。它应该是可以工作的,所以你的问题不在这里,而是在代码中的其他地方