【发布时间】:2010-11-23 01:57:54
【问题描述】:
我有一个在水平布局中包含两个 QTableView 的小部件。我希望他们调整到他们喜欢的大小(这样他们就不必显示自动滚动)。我也不希望他们长得超过他们喜欢的大小,如果有的话,在右边留下空白空间。它应该是这样的:
我尝试在右侧使用间隔符来实现它,但由于自动滚动,视图不会增长。
您能提出任何解决方案吗?
【问题讨论】:
我有一个在水平布局中包含两个 QTableView 的小部件。我希望他们调整到他们喜欢的大小(这样他们就不必显示自动滚动)。我也不希望他们长得超过他们喜欢的大小,如果有的话,在右边留下空白空间。它应该是这样的:
我尝试在右侧使用间隔符来实现它,但由于自动滚动,视图不会增长。
您能提出任何解决方案吗?
【问题讨论】:
如果我理解您的问题,您希望两个 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();
}
【讨论】:
您可以重新实现父级的小部件resizeEvent 函数,而根本不使用布局。因此,当父小部件调整大小时,您可以手动设置表格的大小。
您可以尝试的另一种方法是重新实现 QTableView 的 sizeHint 或/和 minimumSizeHint 函数,以便它们返回适合您的尺寸。
还可以看看 QSizePolicy - 它可能有用
【讨论】: