【问题标题】:Layout with two tableviews problem有两个表视图问题的布局
【发布时间】:2010-11-23 01:57:54
【问题描述】:

我有一个在水平布局中包含两个 QTableView 的小部件。我希望他们调整到他们喜欢的大小(这样他们就不必显示自动滚动)。我也不希望他们长得超过他们喜欢的大小,如果有的话,在右边留下空白空间。它应该是这样的:

我尝试在右侧使用间隔符来实现它,但由于自动滚动,视图不会增长。

您能提出任何解决方案吗?

【问题讨论】:

    标签: qt layout


    【解决方案1】:

    如果我理解您的问题,您希望两个 QTableView 在有足够空间的情况下调整为它们的 PreferredSize(但不超过它们的 PreferredSize),如果没有足够的空间则缩小。如果空间太大,则应留空。这是一个例子:

    #include <QtGui>
    
    int main(int argc, char **argv) {
    
        QApplication app(argc, argv);
        QMainWindow w;
        QHBoxLayout *hbox = new QHBoxLayout;
        QWidget *centralw = new QWidget;
        centralw->setLayout(hbox);
        w.setCentralWidget(centralw);
    
        QTableView *t1 = new QTableView;
        QTableView *t2 = new QTableView;
        // Version one: the preferred size is the maximum size
        // t1->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred));
        // t2->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred));
        // Version two: the preferred size is the only accepted size
        // if you want the widgets not to change their size, change the two previous lines with
        // t1->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
        // t2->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
        // hbox->addWidget(t1);
        // hbox->addWidget(t2);
        // add a stretch that will fill empty space
        // hbox->addStretch(1);
    
        // Version three: tables have a minimum and maximum width. They can be shrunk
        // but they try to expand to take the maximum available space up to their maximum
        // width.
        t1->setMinimumWidth(150);
        t1->setMaximumWidth(400);
        t2->setMinimumWidth(100);
        t2->setMaximumWidth(200);
        t1->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
        t2->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
        hbox->addWidget(t1);
        hbox->addWidget(t2);
        hbox->setStretchFactor(t1, 1);
        hbox->setStretchFactor(t2, 1); // tableviews have the same stretch factor
        hbox->addStretch(0);  // lowest stretch factor
    
        w.show();
    
        return app.exec();
    }
    

    【讨论】:

    • 我已经尝试过了,但它不起作用。问题是,即使有足够的可用空间,QTableView 也会选择显示水平滚动条而不是增长。有什么办法可以改变这种行为?
    • 您可以设置最小和最大小部件宽度,并使用扩展 QSizePolicy 使小部件使用尽可能多的空间,直到最大宽度。我将编辑答案以显示如何做到这一点。
    • 成功了,非常感谢。我可以从水平/垂直标题中获取宽度和高度,并具有动态调整大小的视图。
    【解决方案2】:

    您可以重新实现父级的小部件resizeEvent 函数,而根本不使用布局。因此,当父小部件调整大小时,您可以手动设置表格的大小。

    您可以尝试的另一种方法是重新实现 QTableView 的 sizeHint 或/和 minimumSizeHint 函数,以便它们返回适合您的尺寸。

    还可以看看 QSizePolicy - 它可能有用

    【讨论】:

    • 目前我正在尝试仅使用标准布局/sizePolicy 找到解决方案。如果我没有找到更好的东西,我将恢复到子类化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多