QT ui designer中提供了一個叫做QScrollBar的控件,但這導致了人們的一個誤區,就是必須要使用這個控件,才能使窗口滾動起來
雖然可以通過這個控件來達到目的,但是需要自己去綁定和窗口滾動的一些信號和槽函數,非常麻煩。
因此,我們通常選擇另一種方案來實現窗口滾動:QScrollArea控件。
這個控件自帶了滾動條,我們只需要在使用前設置好這個控件的一些參數即可。

這個控件自帶了一個子控件:QWidget:scrollAreaWidget。 我們需要對這個控件的一些參數進行設置。
要想看到滾動條的一個必要條件就是scrollAreaWidget的尺寸大於scrollArea。


這里我們可以看到,兩個控件尺寸都相同,此時運行程序,是不會看到右邊有垂直滾動條的

我們修改scrollAreaWidget的尺寸高度為1000


再次運行程序

結果還是沒有垂直滾動條,這是什么原因呢?
因為QScrollArea在Qt designer中有一個屬性:WidgetResizable。 它的默認屬性為true(勾選),false(未勾選)

我們需要取消這個鈎,將其屬性設置為false,之后再次運行程序

這是就可以看到右邊出現了滾動條,此時出現的滾動條已經可以通過鼠標滾輪,鼠標左鍵拖拽,點擊來控制顯示區域了,都不需要自己去實現什么函數。
和QScrollBar相比,簡直不要太方便。
但是,再界面上需要動態添加控件的時候,給scrollAreaWidget設置一個固定的尺寸就不合適了,因為當控件的坐標超出scrollAreaWidget的尺寸時,依然無法顯示
此時,就需要在動態生成控件的時候添加一個判斷,判斷控件的位置+尺寸是否超出了scrollAreaWidget的顯示范圍,如果超出,則需要使用函數
ui->scrollAreaWidget->setGeometry(0, 0, 340, ui->scrollAreaWidget->height()+30);
動態的設置scrollAreaWidget的尺寸大小,這樣就能保證無論生成多少動態控件,始終都在scrollAreaWidget范圍內,而且可以通過滾動條滾動來顯示不同區域的控件
補充使用代碼添加滾動區域的方法
首先在界面上隨便放置一個容器,我們這里放置了一個groupbox

然后在頭文件中添加如下代碼
QHBoxLayout *layout; QScrollArea *scrollarea; QWidget *scrollareacontent;
然后在構造函數中添加如下代碼
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) { ui->setupUi(this); scrollarea = new QScrollArea(ui->groupBox); scrollarea->setWidgetResizable(true); scrollarea->setGeometry(0,0,ui->groupBox->width(),ui->groupBox->height()); layout = new QHBoxLayout(ui->groupBox); scrollareacontent = new QWidget(ui->groupBox); scrollareacontent->setLayout(layout); scrollarea->setWidget(scrollareacontent); }
注意,這里設置的父對象是ui->groupbox,就是我們前面添加在主界面上的groupbox控件
然后添加按鈕槽函數,實現點擊一個按鈕就在groupbox中添加一個新按鈕的功能,准確的說,應該是在scrollareacontent中添加新的按鈕
void Widget::on_pushButton_clicked() { QPushButton *btn = new QPushButton(scrollareacontent); btn->setMinimumSize(btn->size()); layout->addWidget(btn); }
新建按鈕的時候,它的父對象是scrollareacontent,如果是別的父對象,滾動條將不會生效。
之后,點擊這個按鈕就可以生成新的按鈕控件,並且自動布局,布局大小超出scrollareacontent之后,會自動出現滾動條。
參考網址:https://www.cnblogs.com/ybqjymy/p/14592422.html
