進入到信號槽的學(xué)習(xí)脐雪。先來一個簡例厌小。
通過了helloworld程序的學(xué)習(xí),可見本例中的框架也是與helloworld如出一轍战秋。本程序?qū)崿F(xiàn)的功能就是創(chuàng)建一個按鈕璧亚,當(dāng)按下這個按鈕時調(diào)用quit函數(shù)退出。
下面,我們重點研究第9行癣蟋。
里面有4個參數(shù)透硝,代表如果button發(fā)出了clicked信號,a就去執(zhí)行我的quit函數(shù)疯搅。
我剛接觸信號槽的時候濒生,覺得非常像js學(xué)習(xí)中的事件,當(dāng)某一事件發(fā)生時幔欧,調(diào)用特定函數(shù)罪治。本程序中的信號槽就是如此,當(dāng)接收到按鍵信息時礁蔗,調(diào)用quit函數(shù)觉义。
進入到組件布局的學(xué)習(xí)。先來一個簡歷浴井。
? ? ? 這段代碼實現(xiàn)的功能就是加入微調(diào)器和滑動桿兩個部件晒骇,然后將他們水平放置,卻改變其中一個的數(shù)據(jù)磺浙,另外一個隨著改變洪囤。
我們先來分析一下這個程序的實現(xiàn)。要實現(xiàn)這兩個部件的信息相關(guān)改變撕氧,可以運用上節(jié)所學(xué)的信息槽實現(xiàn)瘤缩。下面我們就來分析整個程序了。
11行:先引入一個頂級窗口呵曹,這是一個新知識。這個頂級窗口就像是我們這個界面的最大化窗口何暮,便于對部件進行布局奄喂。
12行:設(shè)置窗口標(biāo)題。
14-17行:依次引入微調(diào)器和滑動桿海洼,并設(shè)置取值范圍跨新。這里特別說明一下,滑動桿默認是豎直放置的坏逢,為了美觀域帐,加入Qt::Horizontal進行設(shè)置成水平放置。
19-21行:進行信號槽的鏈接是整,并設(shè)置初始值為25肖揣。
22-26行:引入水平布局,添加微調(diào)器和滑動桿進行水平布局浮入。
最后進行程序的展示龙优,與控制權(quán)利交付,整個程序即完成事秀。
下面簡單介紹一下Qt的主要布局:
QHBoxLayout- 按照水平方向從左到右布局彤断;
QVBoxLayout- 按照豎直方向從上到下布局野舶;
QGridLayout- 在一個網(wǎng)格中進行布局,類似于HTML的table宰衙。
下面是一個對話框程序的創(chuàng)建平道。
先展示一下最后結(jié)果:
對整個框架進行編寫設(shè)計學(xué)習(xí)后,更發(fā)現(xiàn)Qt與html有很多異曲同工之妙供炼。
別看代碼這么長一屋,其實思路很簡單,我絕對暫時最大的問題就是對函數(shù)的運用不熟練了劲蜻。那我就來縷縷這些代碼的邏輯吧陆淀。
我們來觀察一下對整個框架的底層設(shè)計。先是一個最大的框先嬉,然后里面再分小框轧苫,是不是很像html中一個個的table吖。所以疫蔓,本程序的思路非常簡單含懊。
先在.h文件中進行函數(shù)的聲明。
在.cpp文件中進行組件的創(chuàng)建于組件布局衅胀、再完成相應(yīng)的函數(shù)實現(xiàn)即可岔乔。
#include
#include"dialog.h"
Dialog::Dialog(QWidget*parent)
:QDialog(parent)
{
label=newQLabel(tr("Find &what:"));
lineEdit=newQLineEdit;
label->setBuddy(lineEdit);
caseCheckBox=newQCheckBox(tr("Match &case"));
backwardCheacBox=newQCheckBox(tr("Seach &backford"));
findButton=newQPushButton(tr("&find"));
findButton->setDefault((true));
findButton->setEnabled(false);
closeButton=newQPushButton(tr("Close"));
connect(lineEdit,SIGNAL(textChanged(constQString&)),this,SLOT(enableFindButton(constQString)));
connect(findButton,SIGNAL(clicked()),this,SLOT(findChild()));
connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));
QHBoxLayout*topLeftLayout=newQHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);
QVBoxLayout*leftLayout=newQVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheacBox);
QVBoxLayout*rightLayout=newQVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch();
QHBoxLayout*mainLayout=newQHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
setLayout(mainLayout);
setWindowTitle(tr("find"));
setFixedHeight(sizeHint().height());
}
Dialog::~Dialog()
{
}
voidDialog::findChild()
{
QStringtext=lineEdit->text();
Qt::CaseSensitivitycs=caseCheckBox->isChecked()?Qt::CaseInsensitive:Qt::CaseSensitive;
if(backwardCheacBox->isChecked())
{
emitfindPrevious(text,cs);
}
else
{
emitfindNext(text,cs);
}
}
voidDialog::enableFindButton(constQString&text)
{
findButton->setEnabled(!text.isEmpty());
}
在main函數(shù)中進行類的展示。