我有一个 QTabWidget,其中包含高度不同的小部件(它们的宽度是固定的),然而,QTabWidget 的默认实现选择最大小部件的高度作为自己的高度。
我想知道是否有一种(可能快速的)方法来根据当前选项卡更改 QTabWidget 的大小,以节省显示较小选项卡时的空间。
我想知道是否有一种(可能快速的)方法来根据当前选项卡更改 QTabWidget 的大小,以节省显示较小选项卡时的空间。
您可以将显示的窗口小部件的大小策略设置为QSizePolicy::Preferred
,将其他窗口小部件的大小策略设置为QSizePolicy::Ignored
。之后调用adjustSize
更新大小。例如,您可以将QTabWidget
的currentChanged
信号连接到插槽中:
connect(ui->tabWidget,SIGNAL(currentChanged(int)),this, SLOT(updateSizes(int)));
在插槽中设置大小策略并相应地调整大小:
void MainWindow::updateSizes(int index)
{
for(int i=0;i<ui->tabWidget->count();i++)
if(i!=index)
ui->tabWidget->widget(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
ui->tabWidget->widget(index)->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
ui->tabWidget->widget(index)->resize(ui->tabWidget->widget(index)->minimumSizeHint());
ui->tabWidget->widget(index)->adjustSize();
resize(minimumSizeHint());
adjustSize();
}
adjustSize
调用。我已经注释了它们两个,但你的解决方案仍然可以正常工作。 - ABu好的,这个问题已经有一个被接受的答案了,但我决定分享我的解决方案,它非常有效。这是一个基于 Nejat 的答案的小代码片段,它适用于 QTabWidget
和 QStackedWidget
。
template <typename T>
void pack(T *stacked)
{
for(int i=0; i<stacked->count(); i++) {
stacked->widget(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
}
QWidget *widget=stacked->currentWidget();
widget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
widget->resize(widget->minimumSizeHint());
widget->adjustSize();
stacked->resize(stacked->minimumSizeHint());
stacked->adjustSize();
}
QSizePolicy::Minimum
而不是Preferred
并没有改变行为。我必须设置包含QTabWidget的布局的大小为QTabWidget的minimumSizeHint
。 - Burakvoid adjust_minimum_size(QTabWidget* pages)
{
for (int i = 0; i < pages->count(); i++) {
pages->widget(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
}
pages->currentWidget()->resize(1, 1);
pages->currentWidget()->adjustSize();
pages->resize(1, 1);
pages->adjustSize();
pages->window()->resize(1, 1);
pages->window()->adjustSize();
pages->currentWidget()->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
pages->currentWidget()->resize(pages->currentWidget()->minimumSizeHint());
pages->currentWidget()->adjustSize();
pages->resize(pages->minimumSizeHint());
pages->adjustSize();
pages->window()->resize(pages->window()->minimumSizeHint());
pages->window()->adjustSize();
}