QT 添加帶有滾動條的窗口,並使之滾動起來


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM