c++ - 在 QSplitter 中使用 QScrollArea 时的初始窗口大小稍微太小,导致滚动条出现

标签 c++ linux qt

我有一个包含水平 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);
}

最佳答案

所以我想出了一个解决办法。它看起来并不理想,但我创建了自己的 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);
}

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

关于c++ - 在 QSplitter 中使用 QScrollArea 时的初始窗口大小稍微太小,导致滚动条出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44148512/

相关文章:

c++ - 检查两个正方形是否相交

linux - 如何交叉编译我的 Linux 应用程序以在 Linux 中获得 Windows 可执行文件?

c++ - 我的 dll 中的内存分配大小上限为 20MB

linux - 在 bash 中比较 float

linux - 我们需要禁用 riak 交换吗?

qt - QWebkit QWebSettings缓存和QNetworkManager QNetworkDiskCache有什么区别?

c++ - 使用视觉检漏仪

QT 属性 - 语法糖或开发工具

c++ - 从文件中读取数据并保存数据以供以后搜索、插入等的方法

c++ - 使用 Type** &x 创建动态数组