4

我正在处理配置 QDialog。它有几个类别(常规、外观等),当用户单击它们时会加载它们。每个类别都有自己的页面。这些页面本身就是独立的类(每个都有自己的 ui、cpp 和 h)。当 Preferences 窗口加载时,页面被实例化并被加载到 QStackedWidget 中。然后将 Stackedwidget 放置到 QScrollArea 中,以便在必要时可以滚动。

但是,有一个问题。自从我添加了 QStackedWidget 后,即使当前页面短到不需要一个,QScrollArea 也总是有一个垂直滚动条:(图片为最短页面)

配置滚动条问题

ScrollArea 垂直滚动策略设置为 Qt::ScrollBarAsNeeded 因此逻辑上它应该只在页面大于可视区域时显示一个栏。

这是我已经尝试解决的问题:

  1. 将滚动策略设置为 Qt::ScrollBarAlwaysOff。虽然这摆脱了滚动条,但这是不可接受的,因为它不会让用户知道他们需要在长页面上滚动。

  2. 设置 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();

}
4

1 回答 1

5

采用QStackedWidget添加到其中的最大小部件的大小。在您的情况下,您的首选项对话框中最大的页面会影响 的大小,QStackedWidget因此即使看起来没有必要,也会强制滚动区域显示其滚动条。

为了解决这个问题,您可以创建一个在您更改当前小部件之前触发的插槽,该小部件QStackedWidget设置您要离开的页面QSizePolicy::Ignored的大小策略以及您将要显示的页面的大小策略为您想要的任何内容对于那个页面——QSizePolicy::Expanding例如。本页详细介绍了这种技术的一个示例。示例中有很多代码,但重要的部分在这里:

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并且将要查看的页面具有重要的大小策略。

于 2012-09-24T03:55:34.813 回答