代码之家  ›  专栏  ›  技术社区  ›  laura

隐藏子控件时调整qt小部件的大小

  •  14
  • laura  · 技术社区  · 16 年前

    当retry子项被隐藏时,如何调整小部件的大小,使其看起来像第一个图像中的一样?主布局是一个QVBoxLayout,重试子布局也是一个带有QVBoxLayout的小部件。

    我试过以下方法:

    • 更新计量()
    • setGeometry(childrenRect())
    • 布局()->激活()

    4 回复  |  直到 11 年前
        1
  •  20
  •   NoDataDumpNoContribution    11 年前

    这个 adjustSize 函数可以做你想做的。

        2
  •  8
  •   user1175197    13 年前

    dialog.h文件:

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include <QDialog>
    #include <QtGui>
    
    class dialog : public QDialog
    {
        Q_OBJECT
    
    
    public:
        explicit dialog(QWidget *parent = 0)
        {
    
            vlayout.addWidget(&checkbox);
            vlayout.addWidget(&label);
            label.setText("Label");
    
            setLayout(&vlayout);
            this->layout()->setSizeConstraint(QLayout::SetFixedSize); // !!! This is the what makes it auto-resize
    
            checkbox.setChecked(true);
            connect(&checkbox,SIGNAL(toggled(bool)),&label,SLOT(setVisible(bool)));
        }
    
    private:
        QVBoxLayout vlayout;
        QCheckBox checkbox;
        QLabel label;
    
    };
    
    #endif // DIALOG_H
    

    和main.c

    #include <QApplication>
    #include "dialog.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        dialog d;
        d.show();
        return a.exec();
    }
    
        3
  •  4
  •   Lee Dixon    15 年前

    我的问题有点不同,因为我有一个顶级的QWidget(而不是QDialog或QMainWindow),它在一个布局中有子元素。当那些孩子调整到 更大的 ,QWidget会调整大小以适应,但当它们变小时就不会了。就像上面所说的,这个区域只有一片空白。我终于找到了解决办法:

    我的QWidget中使用的布局有一个名为setSizeConstraint()的属性。这通常设置为“QLayout::SetDefaultConstraint”,这只会影响拥有它的QWidget的“minimumSize”。相反,我选择了“QLayout::SetFixedSize”,这使得布局可以调整 固定的 拥有QWidget的大小,在需要时有效地使它变小。

        4
  •  4
  •   B4adle7    14 年前

    这是一个我刚刚开发的答案!!!(注:这将以PyQt4形式给出)

    但是在过去,我只是重新配置UI和/或工作流,这样就不需要重新调整窗口的大小了。然而,现在这是必须的。

    窗口可以在创建期间重新调整大小。窗口可以直接重新调整大小(例如self.resize(xSize,ySize) 但是,如果您创建一些代码行来捕获所需的大小,隐藏所需的部分,重新计算大小应该是多少,那么重新调整大小似乎根本不需要。

    (示例)

    curHgt = self.size().height()
    curWth = self.size().width()
    myFrmHgt = self.ui.reviewFrm.size().height()
    self.ui.reviewFrm.hide()
    self.resize( curWth, (curHgt - myFrmHgt ) )
    

    没有什么。不起作用。为什么不呢?

    它今天的寻找答案仍然没有找到一个可行的答案。有几个选项。查找小部件层次结构,失效,调整大小。一个相当详尽的布局,如果你试图重新调整主窗口的大小,它将不起作用。也有一个压倒性的回应说,设置您的约束为固定大小。但这样做完全违背了目的,有点像说如果你有一个悬垂的指甲,就从手腕上砍掉你的手。

    然而,我偶然发现有人在挖掘中取得了一些成功,并发现重新调整大小的原因是因为发布的事件队列将重新调整大小。

    他的解决方案是在重新调整应用程序大小之前运行QApplication.sendPostedEvents(),这样排队的事件就不会重置窗口。 是的,也不是。 是的,这就是解决办法,我相信有一个更漂亮的方法,但你需要真正摆脱排队像洗油漆辊第一。

    这里是我的简单片段,我设置到目前为止似乎是坚实的。

    result = [ self.size().width(), self.size().height() ]
    if self.ui.reviewFrm.isVisible():
        result[1] -= self.ui.reviewFrm.size().height()
        self.ui.reviewFrm.hide()
    
        while self.size().height() > result[1]:
            self.appy.sendPostedEvents()
            self.resize( result[0], result[1] )
    

    不。不太好看。不过,我最多只能看到它在发布的事件允许窗口调整大小之前摇晃了两次油漆辊。 无需锁定约束或抖动父窗口小部件,也无需在层次结构中查找大小提示。

        5
  •  0
  •   Vladimir Talybin    7 年前

    如果您想在设置后调整小部件的大小 QLayout::SetFixedSize QWidget::resizeEvent() .

    void resizeEvent(QResizeEvent* event) override {
        QWidget::resizeEvent(event);
        layout()->setSizeConstraint(QLayout::SetMinAndMaxSize);
    };