【问题标题】:Qt widget with minimal size to fit all contents最小尺寸的 Qt 小部件以适合所有内容
【发布时间】:2012-11-23 18:05:56
【问题描述】:

我想要一个使用QHBoxLayoutQWidget 实例,并且(理想情况下是自动的,但在调用某些函数时也可以)水平调整大小以适应其内容。水平调整大小就足够了,因为包括容器本身在内的所有小部件都将具有相同的高度。

用例如下:小部件,我们称之为容器,是浮动的,即不属于任何布局。用户应该能够向容器的布局添加更多具有固定大小的小部件(通过调用函数),容器会在此基础上增长以适应其新内容。用户还应该能够删除先前添加的小部件,容器再次缩小。在插入第一个小部件之前,不会创建容器,并在删除最后一个小部件时将其删除,即它始终包含至少一个小部件。

一个例子:添加第一个小部件后,容器看起来像这样,| 是它的左/右边界:

|<1st widget>|

再添加一个之后是这样的:

|<1st widget>  <2nd, longer widget>|

删除第一个小部件后,它看起来像这样:

|<2nd, longer widget>|

我怀疑这应该有点简单,但我在容器的sizeHintsizePolicyadjustSize() 及其布局的sizeContraint 之间迷路了,并且多次尝试明确设置大小和强制更新并且基本上一无所获(即容器根本没有调整大小,容器只会增长但不会缩小等)。我怀疑我一定错过了一些明显的东西..?

【问题讨论】:

    标签: qt layout resize


    【解决方案1】:

    你的猜测是正确的。必须为布局中的小部件设置大小策略。第一个小部件应该有QSizePolicy::Minimum,第二个小部件应该有QSizePolicy::Expanding 以达到预期的效果。这是一个示例应用程序:

    #include <QtGui>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QPushButton *button1 = new QPushButton("Hello");
        button1->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
        QObject::connect(button1, SIGNAL(clicked(bool)), button1, SLOT(hide()));
        QPushButton *button2 = new QPushButton("World");
        button2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
        QObject::connect(button2, SIGNAL(clicked(bool)), button2, SLOT(hide()));
    
        QHBoxLayout *layout = new QHBoxLayout();
        layout->addWidget(button1);
        layout->addWidget(button2);
    
        QWidget main;
        main.setLayout(layout);
        main.show();
    
        return a.exec();
    }
    

    【讨论】:

    • 这很不直观!为什么button2 的策略应该与button1 不同?他们是兄弟姐妹,行为完全相同。我有更复杂的 QFrame 层次结构和各种 V/HBoxLayouts,我完全迷失了......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2010-09-09
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多