1. 程式人生 > >對滾動區域QScrollArea用法的摸索

對滾動區域QScrollArea用法的摸索

好久沒用Qt了。最近在為微控制器驅動電機運動的小製作做軌跡生成程式。發現《C++ GUI Programming with Qt 4》(Second Edition)這本書中的Icon Editor這個例子很合適做我那個程式的軌跡繪製面板,就直接拿來用了。

        我在IconEditor的外部實現了對IconEditor進行放大和縮小的函式。隨著編寫的進行發現如果我將IconEditor中的圖形放大得太大後,有些部分就超出了主視窗的顯示範圍了。這樣我在它上面畫點的時候,就不可避免的有些部分在放大的情況下畫不到了。

        這很容易讓我們想到可以給它加個滾動條。這樣當它超出主視窗大小時,可以通過拖動滾動條來顯示被隱藏的部分。


        在《C++ GUI Programming with Qt 4》(Second Edition)這本書第六章的佈局管理中恰有給IconEditor新增滾動條的章節,真是太好了。書中用的是QScrollArea這個類,實現後結果如圖:

        那麼我想我只要在Qt Creator的Design模式下給我的程式新增一個QScrollArea,再將IconEditor控制元件拖進去就行了。結果是——滾動條根本不出現。我試了很多方法,什麼setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn)讓ScrollBar強制顯示,什麼顯式地呼叫QScrollArea的show()函式,什麼呼叫setWidgetResizable(ture)來告訴QScrollArea要自動重新繪製該視窗部件的大小等等。這些方法都沒有效果,滾動條還是完全無效。


        之後我好好看了下Qt Creator的Design模式下右側的控制元件欄,發現在QScrollArea下還有個名為scrollAreaWidgetContents的QWidget控制元件。為什麼將QScrollArea拖入程式視窗後還會“附送”這麼個控制元件呢?也許QScrollArea預設的就是用這個控制元件作為它的顯示區的吧?不過既然都是QWidget,我就用“Promote to”的方法,將這個scrollAreaWidgetContents直接提升為了IconEditor。滿心歡喜地點執行,結果還是——滾動條無效。

        經過一陣Baidu+Google,發現網上全是《C++ GUI Programming with Qt 4》(Second Edition)中6.4滾動區域一節的抄襲。。。唯一一個有用的資訊就是:不用Qt Creator的介面編輯器來編輯介面,自己寫介面,自己單獨呼叫QScrollArea。可我都已經用了介面編輯器了。經過一陣瘋狂的嘗試,我的解決辦法如下:


        1.在Qt Creator的Design模式中,取消掉程式介面的佈局。已有的控制元件隨便放就行了。

        2.在主程式的類(比如mainwidows)中新增一個QScrollArea指標(如QScrollArea *scrollArea)。

        3.在主程式的建構函式中增加如下語句:

    scrollArea = new QScrollArea(ui->centralWidget);
    scrollArea->setWidget(ui->editor);//設定為你想新增滾動條的widget
    scrollArea->setWidgetResizable(true);

    //自己為控制元件佈局
    hBoxLayout = new QHBoxLayout;
    hBoxLayout->addWidget(scrollArea);//將scrollArea新增進佈局,當然其他佈局也行。但是此句不可缺
    hBoxLayout->addWidget(ui->tableWidget);

    ui->centralWidget->setLayout(hBoxLayout);

       新增這些話後,還沒完。我發現當IconEditor控制元件的sizePolicy設為Preferred時,其滾動條還是不會有效。只有當將IconEditor控制元件的屬性設為Minimum時,滾動條才有效。

       最後滾動條實現的圖片為:


       以上就是我對QScrollArea用法的摸索,不知大家還有沒有別的更簡單的方法?