2017-05-24 280 views
0

我有一个包含水平QSplitter的Qt(5.8 C++)窗口。最初我只包含2个小部件(而不是QScrollArea's),我的主窗口将初始化为每个内部小部件的最小大小(大约500x600),除非我长大窗口,否则分离器不会真正滑动到任何位置,因为组件已经处于最小尺寸。但它看起来不错。但是,由于我知道顶部小部件在典型使用中有时会变得非常大,所以我把它放在QScrollArea中,然后将THAT放入QSplitter的上半部分。我期望它像之前一样初始化为大约500x600(没有滚动条),并且滚动条仅在缩小窗口(或之后增加内部小部件)时出现。但似乎发生的事情是,QScrollArea想要在它所包含的组件周围绘制一个简洁的边框。这会将几个像素添加到显示我的整个窗口小部件所需的最小大小,从而使其始终开始绘制滚动条。如果我用鼠标将窗口的高度增加几个像素,滚动条就会消失。所以每次运行我的应用程序时,我的第一步就是将窗口的高度增加几个像素,以使烦人的滚动条消失。也许QScrollBar不会将边框的像素添加到最小尺寸的高度? (我尝试添加几个像素到最小尺寸,它似乎没有效果)。在QSplitter中使用QScrollArea时的初始窗口大小略微过小使滚动条出现

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

希望下面的示例代码有助于解释我做了什么让这里:

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); 
} 
+0

你可以显示你所得到的,并指出你有错误或不便。 – eyllanesc

+0

我添加了更多文字使其更加清晰。我希望有所帮助。 – user545226

+0

图像会好很多。 – eyllanesc

回答

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); 
} 

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

相关问题