在QSplitter中使用QScrollArea时的初始窗口大小略小,导致滚动条显示

时间:2017-05-24 03:37:22

标签: c++ linux qt

我有一个Qt(5.8 C ++)窗口,其中包含一个水平QSplitter。最初我只包含2个小部件(不是QScrollArea' s),我的主窗口将初始化为每个内部小部件的最小大小(大约500x600),除非我增长窗口,否则拆分器不会真正滑动到任何位置,因为组件已达到最小尺寸。但它看起来不错。

但是,由于我知道顶级窗口小部件有时会在常规使用中变得非常大,所以我将它放在QScrollArea中并将THAT放入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);
}

1 个答案:

答案 0 :(得分:0)

所以我想出了一个解决方案。它似乎并不理想,但我创建了自己的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);
}

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