2012-10-21 212 views
2

我一直在從視頻教程here學習qt。 我已完成35個視頻。所以我想創建一個示例應用程序來了解qt。 我正在使用最新版本的qt創建器。在qt窗口中添加滾動條?

我添加了一些的按鈕 &刪除在主窗口中的菜單欄&工具欄。

enter image description here

運行後,我發現,如果我調整窗口滾動條不會出現。

enter image description here

我不希望的按鈕來調整或移動。我很好,他們變得不可見,但我想滾動條,以便用戶可以滾動到不可見的部分。 我添加了滾動區域小部件,但它不起作用。我通過在互聯網上搜索做了一些編碼,但也沒有工作。當我增加滾動區域的大小直到窗口大小;運行後窗口出現空白。也許按鈕在滾動區域的下方。我如何改變哪個對象應該放在'頂部'?

也因爲我只是一個初學者,我不知道什麼是使用qt設計的最佳方法。我應該只是把所需的小部件,使用設計師&然後通過編碼給他們的特點?還是應該使用設計器完成設計?還是應該放棄設計師&做完整的編碼? 謝謝!

編輯 @Synxis, 是沒有幫助很大。我甚至使用了secentralwidget(ui-> scrollareacontentswidget); 我試圖刪除centralwidget QWidget,但我不能。 任何解決方案?

enter image description here

回答

3

一個QWidget沒有滾動條,你需要添加這將有滾動條的區域。

只需添加一個QScrollArea到你的窗口,並把所有的小工具(按鈕等)。不要忘記將滾動區域佈置到整個主窗口。

更準確,層次是類似的東西:

main window central widget (with a layout) 
    scroll area 
     scroll area widget (with a layout, layout scroll area if you're in the designer) 
      your container widget (should be layouted also) 
       your buttons, layouts, etc... 

(with a layout) =佈局,佈局小部件,但佈局並不重要的類型,因爲只有一個小部件需要被layouted )。

您的容器小部件應該根據需要進行佈置,墊片可能很有用。

+0

感謝您的回覆,但你能告訴我該怎麼做嗎? 因爲我已經添加了按鈕,在此之後,如果我添加了Scrollarea小部件,它將成爲centralwidget的子項。我怎樣才能從centralwidget到scrollarea更改父按鈕? –

+1

在設計器中,將QScrollArea添加爲主窗口的子項。然後,在其中移動'centralWidget'。現在只有滾動區域位於主窗口中,因此您可以使用佈局(因佈局只佈置1個元素,哪種佈局無關緊要)。 – Synxis

+0

不確定我是否足夠清楚,'centralWidget'必須是滾動區域的小部件(請參閱文檔以獲取更多解釋)。 – Synxis

0

讓QHBoxLayout成爲一個普通的QWidget()對象,然後將該widget對象設置爲滾動區域的widget調用setWidget()。這一切都需要。或者至少有時你需要調用setWidgetResizable(bool)如果可以使用額外的空間。示例代碼如下。

#include <QtGui> 

class YourWidget : public QWidget 
{ 
public: 
    YourWidget(QWidget* parent=0) 
     : QWidget(parent) 
    { 
     QHBoxLayout* buttonLay = new QHBoxLayout; 
     for (int i=0; i<10; ++i) { 
      QPushButton* button = new QPushButton(tr("Button%1").arg(i)); 
      buttonLay->addWidget(button); 
     } 

     QLabel* dummyBigLabel = new QLabel(tr("DummyBigLabel")); 
     dummyBigLabel->setAlignment(Qt::AlignCenter); 
     dummyBigLabel->setMinimumSize(400,300); 
     dummyBigLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken); 

     QVBoxLayout* mainLay = new QVBoxLayout(this); 
     mainLay->addLayout(buttonLay); 
     mainLay->addWidget(dummyBigLabel); 
    } 
}; 

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 

QWidget* topLevelWidget = 0; 
    YourWidget* editor = new YourWidget; 
#ifdef USE_NO_SCROLL_AREA 
    topLevelWidget = editor; 
#else 
    QScrollArea* scroller = new QScrollArea; 
    scroller->setWidget(editor); 
    topLevelWidget = scroller; 
#endif 
    topLevelWidget->show(); 
    topLevelWidget->raise(); 
    return app.exec(); 
} 
+0

感謝您的回覆,但我無法得到你想說的話。 也許這是因爲我只是一個初學者。 可否請你解釋一下你的代碼? 再次感謝:) –

+1

嗯。我認爲可以編譯和執行的示例代碼是最簡單的指南。 Qt的代碼本身非常可讀。如果你可以提到上述代碼的部分內容是不可理解的,那麼我可以幫助你更多。 – Joonhwan