在 QSplitter 中使用 QScrollArea 时的初始窗口大小稍微太小,使得滚动条出现

Posted

技术标签:

【中文标题】在 QSplitter 中使用 QScrollArea 时的初始窗口大小稍微太小,使得滚动条出现【英文标题】:Initial window size when using a QScrollArea within QSplitter slightly too small making scrollbars show up 【发布时间】:2017-05-24 03:37:22 【问题描述】:

我有一个包含水平 QSplitter 的 Qt (5.8 C++) 窗口。最初我只包含 2 个小部件(不是 QScrollArea),我的主窗口将初始化为每个内部小部件的最小尺寸(大约 500x600),除非我增大窗口,否则拆分器不会真正滑动到任何地方,因为组件已经处于最小尺寸.不过看起来不错。

但是,由于我知道顶部小部件在典型使用中有时会变得非常大,因此我将它放在 QScrollArea 中,然后将其放入 QSplitter 的上半部分。我希望它像以前一样初始化为大约 500x600(没有滚动条),并且只有在我缩小窗口(或之后增加内部小部件)时才会出现滚动条。但似乎发生的是 QScrollArea 想要在它包含的组件周围绘制一个窄边框。这会在显示整个小部件所需的最小尺寸上增加几个像素,导致它总是开始绘制滚动条。如果我使用鼠标将窗口的高度增加几个像素,滚动条就会消失。所以每次我运行我的应用程序时,我的第一步是将窗口的高度增加几个像素,以消除烦人的滚动条。也许 QScrollBar 不会将边框的那些像素添加到最小尺寸的高度? (我确实尝试在最小尺寸上添加几个像素,但似乎没有效果)。

如果窗口小部件足够小以使窗口小于全屏,有没有办法让我的窗口初始化为没有滚动条?我只希望滚动条在必要时出现。

希望以下示例代码有助于解释我所做的一切:

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow) 

    auto centralSplitter = new QSplitter(Qt::Vertical);
    setCentralWidget(centralSplitter);

    auto button1 = new QPushButton("Top\nButton\n(Add more lines of text than this to make button taller)");

    //This looks fine, but has no scroll bar
    //centralSplitter->addWidget(button1); 

    // This creates a scroll bar even if it shouldn't be necessary 
    auto scrollArea1 = new QScrollArea;  
    scrollArea1->setWidget(button1);
    centralSplitter->addWidget(scrollArea1);


    auto button2 = new QPushButton("Bottom\nButton\n(I also added more text here too)");
    centralSplitter->addWidget(button2);

【问题讨论】:

您可以展示您得到的结果并指出您遇到的错误或不便。 我添加了更多文字以使其更清晰。我希望这会有所帮助。 一张图片会好很多。 我一开始没有滚动条,只有在我缩小尺寸时才会出现。 不幸的是我现在在工作。当我回到家时,我将不得不尝试提供图像。我没有意识到我们可以包含图像……我在 Linux 上的 Qt 5.8 上运行。您使用的是 Windows 还是其他操作系统?也许您可以尝试在测试中使按钮变大?我大概用了 10-15 次“A\nA\n......”之类的东西来让它们变高。我没有粘贴它,因为我认为这无关紧要。 【参考方案1】:

所以我想出了一个解决方案。这似乎并不理想,但我创建了自己的 QScrollArea 子类并重载了 sizeHint() 以将 6 个像素添加到它包含的小部件的宽度和高度。 (经过反复试验,我达到了 6 点)。

class MyScrollArea: public QScrollArea 
public:
    virtual QSize sizeHint() const;
;

QSize MyScrollArea::sizeHint() const 
    auto widgetSize = widget()->sizeHint();
    return QSize(widgetSize.width()+6,widgetSize.height()+6);

现在窗口初始化时没有任何滚动条,就像我之前预期的那样。

【讨论】:

以上是关于在 QSplitter 中使用 QScrollArea 时的初始窗口大小稍微太小,使得滚动条出现的主要内容,如果未能解决你的问题,请参考以下文章

如何设置qsplitter中widget的默认宽度

分割窗口QSplitter类

如何使 PyQt QSplitter 可见?

QSplitter 显示两个小部件之间的分隔线或边距

从 QSplitter 中删除小部件

从 QSplitter 中移除 QWidget(使用隐藏与显示,切换十分方便,不要真正销毁)