我正在使用Configuration QDialog。它有几个类别(常规,外观等),当用户点击它们时会加载它们。每个类别都有自己的页面。这些页面本身就是单独的类(每个页面都有自己的ui,cpp和h)。加载“首选项”窗口时,页面将被实例化并加载到QStackedWidget中。然后将Stackedwidget放入QScrollArea中,以便在必要时滚动。
然而,有一个问题。自从我添加了QStackedWidget之后,QScrollArea 总是有一个垂直滚动条,即使当前页面足够短也不需要一个:(图片显示最短的页面)
ScrollArea垂直滚动策略设置为Qt :: ScrollBarAsNeeded,因此逻辑上它应该只显示一个条,如果页面大于可视区域。
这是我已经尝试解决的问题:
将滚动策略设置为Qt :: ScrollBarAlwaysOff。虽然这摆脱了滚动条,但它不可接受,因为它不会让用户知道他们需要在长页面上滚动。
设置QStackedwidget的最小/最大高度。如果我将滚动条设置为足够低的值,这会使滚动条消失,但这是不可接受的,因为它会导致某些小部件具有压扁的外观。
我知道问题与QStackedWidget有关,但由于这是我第一次使用QStackedWidget,我不确定它是什么。我也注意到卷轴总是相同的数量;即,无论页面小部件有多大/多小,可滚动区域总是相同的大小。出于某种原因,它比最长的页面略大。起初我以为我在每页底部放置的垂直垫片都会导致这种情况变得严重,但是将它们拿出来并没有解决它。
更新:这里是控制Stackedwidget的代码:
void Newconfig::on_Categories_currentItemChanged(QTreeWidgetItem *current)
{
QModelIndex index=ui->Categories->currentIndex();
int idx=index.row();
QString category=current->text(0);
this->setWindowTitle("Preferences -- " + category);
if (stack->currentWidget() != 0) {
stack->currentWidget()->setSizePolicy(QSizePolicy::Ignored,
QSizePolicy::Ignored);
}
stack->setCurrentIndex(idx);
stack->currentWidget()->setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Expanding);
adjustSize();
}
答案 0 :(得分:5)
QStackedWidget
采用添加到其中的最大小部件的大小。在您的情况下,首选项对话框中最大的页面会影响QStackedWidget
的大小,因此强制滚动区域显示其滚动条,即使它看起来不是必要的。
要解决此问题,您可以创建一个在更改QStackedWidget
中当前窗口小部件之前触发的插槽,该窗口小部件将您要离开的页面的大小策略设置为QSizePolicy::Ignored
和大小您要向该页面显示的页面政策 - 例如QSizePolicy::Expanding
。 this page详细介绍了这种技术的一个例子。示例中有很多代码,但重要的部分是:
void changeCurrent(int idx)
{
if (stackWidget->currentWidget() !=0) {
stackWidget->currentWidget()->setSizePolicy(QSizePolicy::Ignored,
QSizePolicy::Ignored);
}
stackWidget->setCurrentIndex(idx);
stackWidget->currentWidget()->setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Expanding);
adjustSize();
}
调用此函数可更改QStackedWidget
上的当前索引。它会导致刚查看的页面具有不会影响QStackedWidget
整体大小的大小策略以及即将被视为具有重要大小策略的页面。