程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Qt學習之路(5):組件布局

Qt學習之路(5):組件布局

編輯:關於C++

顧名思義,絕對定位就是使用最原始的定位方法,給出這個組件的坐標和長寬值。這樣,Qt就知道該把組件放在哪裡,以及怎麼設置組件的大小了。但是這樣做的一個問題是,如果用戶改變了窗口大小,比如點擊了最大化或者拖動窗口邊緣,這時,你就要自己編寫相應的函數來響應這些變化,以避免那些組件還只是靜靜地呆在一個角落。或者,更簡單的方法是直接禁止用戶改變大小。

不過,Qt提供了另外的一種機制,就是布局,來解決這個問題。你只要把組件放入某一種布局之中,當需要調整大小或者位置的時候,Qt就知道該怎樣進行調整。這類似於Swing的布局管理器,不過Qt的布局沒有那麼多,只有有限的幾個。

來看一下下面的例子:

#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtGui/QSpinBox>
#include <QtGui/QSlider>
#include <QtGui/QHBoxLayout>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget *window = new QWidget;
window->setWindowTitle("Enter your age");

QSpinBox *spinBox = new QSpinBox;
QSlider *slider = new QSlider(Qt::Horizontal);
spinBox->setRange(0, 130);
slider->setRange(0, 130);

QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
spinBox->setValue(35);

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spinBox);
layout->addWidget(slider);
window->setLayout(layout);

window->show();

return app.exec();
}

這裡使用了兩個新的組件:QSpinBox和QSlider,以及一個新的頂級窗口QWidget。QSpinBox是一個有上下箭頭的微調器,QSlider是一個滑動桿,只要運行一下就會明白到底是什麼東西了。

代碼並不是那麼難懂,還是來簡單的看一下。首先創建了一個QWidget的實例,調用setWindowTitle函數來設置窗口標題。然後創建了一個QSpinBox和QSlider,分別設置了它們值的范圍,使用的是setRange函數。然後進行信號槽的鏈接。這點後面再詳細說明。然後是一個QHBoxLayout,就是一個水平布局,按照從左到右的順序進行添加,使用addWidget添加好組件後,調用QWidget的 setLayout把QWidget的layout設置為我們定義的這個Layout,這樣,程序就完成了!

編譯運行一下,可以看到效果:

如果最大化的話:

雖然我並沒有添加任何代碼,但是那個layout就已經明白該怎樣進行布局。

或許你發現,那兩個信號槽的鏈接操作會不會產生無限遞歸?因為steValue就會引發valueChanged信號!答案是不會。這兩句語句實現了,當spinBox發出valueChanged信號的時候,會回調slider的setValue,以更新slider的值;而slider發出 valueChanged信號的時候,又會回調slider的setValue。但是,如果新的value和舊的value是一樣的話,是不會發出這個信號的,因此避免了無限遞歸。

迷糊了吧?舉個例子看。比如下面的spinBox->setValue(35)執行的時候,首先,spinBox會將自己的值設為35,這樣,它的值與原來的不一樣了(在沒有setValue之前的時候,默認值是0),於是它發出了valueChanged信號。slider接收到這個信號,於是回調自己的setValue函數,將它的值也設置成35,它也發出了valueChanged信號。當然,此時spinBox又收到了,不過它發現,這個35和它本身的值是一樣的,於是它就不發出信號,所以信號傳遞就停止了。

那麼,你會問,它們是怎麼知道值的呢?答案很簡單,因為你的信號和槽都接受了一個int參數!新的值就是通過這個進行傳遞的。實際上,我們利用Qt的信號槽機制完成了一個數據綁定,使兩個組件或者更多組件的狀態能夠同步變化。

Qt一共有三種主要的layout,分別是:

QHBoxLayout- 按照水平方向從左到右布局;

QVBoxLayout- 按照豎直方向從上到下布局;

QGridLayout- 在一個網格中進行布局,類似於HTML的table。

layout使用addWidget添加組件,使用addLayout可以添加子布局,因此,這就有了無窮無盡的組合方式。

我是在Windows上面進行編譯的,如果你要是在其他平台上面,應用程序就會有不同的樣子:

還記得前面曾經說過,Qt不是使用的原生組件,而是自己繪制模擬的本地組件的樣子,不過看看這個截圖,它模擬的不能說百分百一致,也可說是惟妙惟肖了… :)

出處: http://devbean.blog.51cto.com/448512/194616

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved