快速創(chuàng)建qt工程
當(dāng)我們熟悉基本的從空項(xiàng)目創(chuàng)建qt應(yīng)用程序后扼睬,以后我們可以直接從模板中創(chuàng)建一個(gè)qt工程
注意,本節(jié)暫時(shí)不使用界面文件來(lái)創(chuàng)建UI界面悴势,所以將下圖的單選框取消選中窗宇。
下圖的向?qū)?huì)自動(dòng)創(chuàng)建一個(gè)C++類MyWidget派生自QWidget類
創(chuàng)建工程完畢后,如下圖所示特纤,派生出的MyWidget類也將自動(dòng)創(chuàng)建對(duì)象军俊,并顯示
mywidget.h頭文件內(nèi)容
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
};
#endif // MYWIDGET_H
mywidget.cpp源碼
#include "mywidget.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
}
MyWidget::~MyWidget()
{
}
上述頭文件和源碼將作為一個(gè)自定義的窗口類使用,我們可以在窗口類的構(gòu)造函數(shù)里創(chuàng)建其他Qt控件
上述Qt程序的執(zhí)行流程
- 首先進(jìn)入main函數(shù)
- QApplication a(argc, argv);
根據(jù)啟動(dòng)參數(shù)創(chuàng)建了一個(gè)Qt應(yīng)用程序 - MyWidget w;
調(diào)用MyWidget類的構(gòu)造函數(shù)捧存,創(chuàng)建出一個(gè)對(duì)象w - w.show();
顯示出這個(gè)窗口控件 - a.exec();
Qt應(yīng)用程序后續(xù)將持續(xù)阻塞在該語(yǔ)句粪躬,內(nèi)部為主線程的循環(huán) - 當(dāng)a.exec()指定完畢后,攜帶著程序執(zhí)行結(jié)果代碼昔穴,通過(guò)return返回镰官。
直接在父控件的構(gòu)造函數(shù)中創(chuàng)建一個(gè)按鈕
在mywidget.h頭文件中對(duì)MyWidget類的public中插入
QPushButton b1,*b2
在mywidget.cpp的MyWidget類構(gòu)造函數(shù)中插入以下代碼
b1.setParent(this);
b1.setText("我是b1對(duì)象");
b2=new QPushButton(this);
b2->setText("我是b2指針");
b2->move(100,100);
運(yùn)行結(jié)果如下,
按鈕點(diǎn)擊事件
通過(guò)connect吗货,可以建立一條“信號(hào)傳輸?shù)木€路”泳唠,使得某信號(hào)接收器能夠接收到某Widget控件所發(fā)出的信號(hào),也就是connect的過(guò)程宙搬。
實(shí)現(xiàn)按下b1后程序關(guān)閉
如上代碼中笨腥,想要按下b1按鈕后關(guān)閉整個(gè)程序,可以在MyWidget構(gòu)造函數(shù)中插入以下代碼
connect(&b1,&QPushButton::pressed,this,&MyWidget::close);
各個(gè)實(shí)參解釋:
- &b1:信號(hào)發(fā)出者勇垛,是一個(gè)指針類型
- &QPushButton::pressed:
要處理的信號(hào)脖母,一般是 &發(fā)送者的類名::信號(hào)名 - 信號(hào)接收者
- 信號(hào)處理函數(shù)(槽函數(shù)slot)
一般是 &接收者的類名::槽函數(shù)名
當(dāng)b1按下時(shí)候,立馬發(fā)出一個(gè)信號(hào)給this(信號(hào)接受者)闲孤,然后調(diào)用信號(hào)接收者中的槽函數(shù)close方法谆级,即Qt程序窗口將被關(guān)閉。
同理,我們還可以發(fā)送b2按鈕的released信號(hào)哨苛,并讓信號(hào)接受者為b2鸽凶,處理函數(shù)為b2的hide成員函數(shù)币砂,當(dāng)我們點(diǎn)擊b2并松開時(shí)建峭,b2按鈕的hide方法將被調(diào)用,即b2按鈕消失决摧。
connect(b2,&QPushButton::released,b2,&QPushButton::hide);
自定義槽函數(shù)
在Qt5中亿蒸,槽函數(shù)可以使任意類的成員函數(shù),也可以是全局普通函數(shù)掌桩,還可以是靜態(tài)函數(shù)
槽函數(shù)要與信號(hào)相一致(參數(shù)边锁,返回值)
由于信號(hào)都沒(méi)有返回值,所以槽函數(shù)一定無(wú)返回值波岛。
示例:
在頭文件的類定義的public中添加void mySlot()函數(shù),
在源文件中添加void MyWidget::mySlot()函數(shù)的定義
通過(guò)connect方法建立信號(hào)和槽之間的通信鏈路
connect(b2,&QPushButton::clicked,this,&MyWidget::mySlot);
多個(gè)信號(hào)和槽之間建立鏈路連接
#include "mywidget.h"
//#include <QPushButton>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this);
b1.setText("關(guān)閉當(dāng)前窗口");
b2=new QPushButton(this);
b2->setText("改變此按鈕文本");
b2->move(100,100);
connect(&b1,&QPushButton::pressed,b2,&QPushButton::hide);
connect(&b1,&QPushButton::released,this,&MyWidget::close);
connect(b2,&QPushButton::clicked,this,&MyWidget::mySlot);
}
void MyWidget::mySlot()
{
MyWidget::b2->setText("Hello");
}
MyWidget::~MyWidget()
{
}
如上代碼茅坛,可以分別實(shí)現(xiàn):
- 當(dāng)b1按下時(shí),b2所指向的按鈕隱藏
- 當(dāng)b1松開時(shí)则拷,將關(guān)閉窗口
- 當(dāng)b2點(diǎn)擊時(shí)贡蓖,將調(diào)用自定義的mySlot函數(shù),設(shè)置b2指向的按鈕的文本為"Hello"
由此可得煌茬,信號(hào)類似短信斥铺,同一條信號(hào)可以發(fā)送給多個(gè)不同的接受者,或不同信號(hào)可以發(fā)送給同一個(gè)接受者坛善,其中connect用于建立發(fā)送信號(hào)的鏈路晾蜘。