gpt4 book ai didi

qt - 摆脱 QScrollArea 中不必要的滚动条

转载 作者:行者123 更新时间:2023-12-05 01:20:31 30 4
gpt4 key购买 nike

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

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

Config scrollbar problem

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

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

  • 将滚动策略设置为 Qt::ScrollBarAlwaysOff。虽然这摆脱了滚动条,但这是 Not Acceptable ,因为它不会让用户知道他们需要在长页面上滚动。
  • 设置 QStackedwidget 的最小/最大高度。如果我将其设置为足够低的值,这会使滚动条消失,但这是 Not Acceptable ,因为它会导致某些小部件的外观被压扁。

  • 我知道问题与 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();

    }

    最佳答案

    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 的整体大小没有影响的大小策略。以及即将被查看的页面具有影响大小的策略。

    关于qt - 摆脱 QScrollArea 中不必要的滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12557670/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com