日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

QT4 自定义槽和信号

發(fā)布時(shí)間:2024/1/17 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT4 自定义槽和信号 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
QT4 自定義槽和信號(hào)
本文所示代碼在windows xp + MingW3.4.2+ eclipse3.4+CDT5.0版本中調(diào)試通過(guò)
? ? QT系統(tǒng)為我們提供功能非常全面信號(hào)處理機(jī)制,它的內(nèi)制信號(hào)和槽已經(jīng)非常全面,因此大多數(shù)情況下,我們不需要自己設(shè)計(jì)信號(hào)和槽,但是有些時(shí)候,我們可能需要設(shè)計(jì)一些獨(dú)特的信號(hào)和槽,來(lái)滿足程序的需求。QT的核心機(jī)制信號(hào)和槽是獨(dú)立于C++的,一般C++設(shè)計(jì)處理如按鈕點(diǎn)擊等方法,多采用回調(diào)函數(shù),而回調(diào)函數(shù)設(shè)計(jì)上的復(fù)雜,雖然執(zhí)行效率相對(duì)于QT信號(hào)與槽要高,但是其導(dǎo)制容易出錯(cuò)。況且在日常應(yīng)用程序設(shè)計(jì)中來(lái)說(shuō),這種高效率相差不成比例,因此QT采用自己獨(dú)門(mén)設(shè)計(jì),來(lái)高效的編程。本文也同樣倡導(dǎo)大家使用信號(hào)與槽。
? ? 如何才能設(shè)計(jì)自己的信號(hào)和槽呢,閱讀完本節(jié)您將會(huì)輕松實(shí)現(xiàn)自己的需求。
? ? 在創(chuàng)建信號(hào)和槽之前首先大家需要建立三個(gè)文件:類(lèi)申明文件(yourclass.h),類(lèi)實(shí)現(xiàn)文件(youclass.cpp),程序主體文件(main.cpp)。
? ? 請(qǐng)看下面的例子,假設(shè)我們需要一個(gè)來(lái)處理文本框的內(nèi)容的程序,程序主界面有兩個(gè)按鈕,當(dāng)們點(diǎn)擊按鈕[Modify]時(shí),文本框內(nèi)容被改為“jingjing”。
1、自定義槽:
? ? 按鈕點(diǎn)擊信號(hào)clilcked()通過(guò)繼承已經(jīng)存在,因此我們暫時(shí)不需要定義這個(gè)信號(hào)。那么我們要改變文本框內(nèi)容,就需要自己定義一個(gè)槽,來(lái)響應(yīng)點(diǎn)擊信號(hào)。
? ? 示例代碼(類(lèi)申明文件 yourclass.h):
Copy code
#ifndef YOURCLASS_H_
? ? #define YOURCLASS_H_
? ? #include <QWidget>? ? ? ? ? ? ? ? ? ? ? ? //QT窗口應(yīng)用程序需要包含的文件
? ? #include <QPushButton>? ? ? ? ? ? ? ? ? ? //制作按鈕時(shí),需要包含
? ? #include <QLineEdit>? ? ? ? ? ? ? ? ? ? ? //制作文本框時(shí),需要包含
? ? class MyMainWindows:public QWidget? ? ? ? //申明一個(gè)MyMainWindows類(lèi),這個(gè)類(lèi)用于實(shí)現(xiàn)窗體
? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?? Q_OBJECT? ? ? ? ? ? ? ? ? ? ? ? ? ? //Q_OBJECT是在定制信號(hào)和槽和必須包含的一條宏語(yǔ)句
? ? public:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? MyMainWindows();? ? ? ? ? ? ? ? ? ? //類(lèi)構(gòu)造函數(shù)(用于實(shí)現(xiàn)程序的主體部份)
? ? public slots:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有的槽函數(shù)都必須申明public slots語(yǔ)句內(nèi)
? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個(gè)槽函數(shù)用于顯應(yīng)點(diǎn)擊按鈕時(shí)改變文本框內(nèi)容
? ? private:
? ? ? ? QPushButton * pb;? ? ? ? ? ? ? ? ? ? //申請(qǐng)一個(gè)按鈕QPushButton
? ? ? ? QLineEdit * ledit;? ? ? ? ? ? ? ? ? ? ? //申請(qǐng)一個(gè)文本框ledit
? ? };
? ? #endif /* YOURClASS_H_ */? ?
? ? 在上面的示例代碼中,我們申明了一窗口應(yīng)用程序類(lèi)文件,它的功能是申明程序所需要全部元素信息。在這個(gè)類(lèi)中,我們申明了自己的槽SlotTest()函數(shù),來(lái)響應(yīng)按鈕點(diǎn)擊的信號(hào)。如下所示:
Copy code
public slots:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有的槽函數(shù)都必須申明public slots語(yǔ)句內(nèi)
? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個(gè)槽函數(shù)用于顯應(yīng)點(diǎn)擊按鈕時(shí)改變文本框內(nèi)容
? ? 正如代碼中注釋說(shuō)明,在自定義槽和信號(hào)是有兩點(diǎn)是至關(guān)重要的:
? ? 第一點(diǎn):所有的槽函數(shù)都需要包含在public slots語(yǔ)句下面。它的申明和類(lèi)的公有函數(shù)方法pulic是類(lèi)似的。如果你有多個(gè)槽函數(shù),只要需要一一列出即可。
? ? 第二點(diǎn);在類(lèi)的文件開(kāi)始部份應(yīng)含Q_OBJECT宏語(yǔ)句,請(qǐng)記住它不需要標(biāo)點(diǎn)符號(hào),所以不要加[;]符號(hào)。所有的QT自定義槽和信號(hào)都需要有它的存在。
? ? 下面是制作第二個(gè)文件:類(lèi)實(shí)現(xiàn)文件yourclass.cpp。在這個(gè)文件用于yourclass.h中申明的元素實(shí)現(xiàn)部份。
? ? 示例代碼(類(lèi)實(shí)現(xiàn)文件yourclass.cpp)
Copy code
#include "yourclass.h"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //包含yourclass.h類(lèi)申明文件

MyMainWindows::MyMainWindows()? ? ? ? ? ? ? ? ? ? //實(shí)現(xiàn)構(gòu)造函數(shù)
{
? setGeometry(90,90,300,200);? ? ? ? ? ? ? ? ? ? ? ? ? //繪制主窗體,大小為300X200
? pb = new QPushButton("Modify",this);? ? ? ? ? ? ? ? ? //實(shí)現(xiàn)pb按鈕,被設(shè)計(jì)其名字為Modify
? pb->setGeometry(10,10,100,20);? ? ? ? ? ? ? ? ? ? ? ? //繪制pb按鈕的位置(10,10)和大小(100,20)
? ledit = new QLineEdit("what's your name",this);? ? ? ? ? //實(shí)現(xiàn)ledit文件框,其內(nèi)容為what's your name
? ledit->setGeometry(10,30,200,150);? ? ? ? ? ? ? ? ? ? //繪制ledit文件框位置(10,30)和大小(200,150)
? connect(pb,SIGNAL(clicked()),this,SLOT(SlotTest()));? ? //連接pb按鈕的點(diǎn)擊clicked()信號(hào)和自定義槽SlotTest()
}


void MyMainWindows::SlotTest()? ? ? ? ? ? ? ? ? ? ? ? //自定義槽函數(shù)的實(shí)現(xiàn)方法,重置文本框的內(nèi)容
{
? ledit->setText("jingjing");? ? ? ? ? ? ? ? ? ? ? ? ? ? //“jingjing”為點(diǎn)擊按鈕Modify后的內(nèi)容
}
在yourclass.cpp中,我們實(shí)現(xiàn)了程序的全部功能,程序的執(zhí)行還需要有一個(gè)入口。它的主體部分mian.cpp。
Copy code
#include <QApplication>? ? ? ? ? ? ? //所有QT應(yīng)用程序都要包含QApplication頭文件
#include "yourclass.h"? ? ? ? ? ? ? ? //包含類(lèi)定義文件yourclass.h
int main(int argc,char * argv[])
{
? QApplication app(argc,argv);? ? ? ? //申明一個(gè)QT應(yīng)用程序?qū)ο馻pp
? MyMainWindows w;? ? ? ? ? ? ? ? ? ? ? //申明我們實(shí)現(xiàn)MyMainWindows窗體對(duì)像 w.
? w.show();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //顯示這個(gè)w 窗體
? return app.exec();
}
程序編譯完成后執(zhí)行當(dāng)點(diǎn)擊Modify按鈕,文本內(nèi)容what's your name 被修改為jingjing
2、自定義信號(hào)
? ? 在上例中,我們了解了怎樣來(lái)實(shí)現(xiàn)自己的槽函數(shù),在下文中我們將介紹怎么實(shí)現(xiàn)自己的信號(hào)。QT信號(hào)的申明與實(shí)現(xiàn),相對(duì)QT槽函數(shù)來(lái)說(shuō),要更加容易一些。它相當(dāng)于一系列函數(shù)原型。不需要有具體實(shí)現(xiàn)處理內(nèi)容。在上文中,我們是通過(guò)點(diǎn)擊clicked()這個(gè)信號(hào),來(lái)連接槽函數(shù)SlotTest(),并達(dá)到修改文本框的內(nèi)容。本例中,我們將在窗體添加一個(gè)文字標(biāo)簽label,然后在槽函數(shù)SlotTest()中測(cè)試label內(nèi)容是否發(fā)生變化,如果發(fā)生了變化,就引發(fā)信號(hào)SigTest()。該信號(hào)連接到槽函數(shù)SlotTest2(),將文本框內(nèi)容修改為"SigSig"。
? ? 下面為實(shí)現(xiàn)文件:
? ? 請(qǐng)打開(kāi)上節(jié)中的yourclass.h文件,在代碼加入一個(gè)槽函數(shù)SlotTest2(),和一個(gè)信號(hào)SigTest()。紅色代碼為新增加內(nèi)容,如下所示:
Copy code
#ifndef YOURCLASS_H_
? ? #define YOURCLASS_H_
? ? #include <QWidget>? ? ? ? ? ? ? ? ? ? ? ? //QT窗口應(yīng)用程序需要包含的文件
? ? #include <QPushButton>? ? ? ? ? ? ? ? ? ? //制作按鈕時(shí),需要包含
? ? #include <QLineEdit>? ? ? ? ? ? ? ? ? ? ? //制作文本框時(shí),需要包含
? ? #include <QLabel>? ? ? ? ? ? ? ? ? ? ? ? //制作文本標(biāo)簽時(shí),需要包含
? ? class MyMainWindows:public QWidget? ? ? ? //申明一個(gè)MyMainWindows類(lèi),這個(gè)類(lèi)用于實(shí)現(xiàn)窗體
? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?? Q_OBJECT? ? ? ? ? ? ? ? ? ? ? ? ? ? //Q_OBJECT是在定制信號(hào)和槽和必須包含的一條宏語(yǔ)句
? ? public:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? MyMainWindows();? ? ? ? ? ? ? ? ? ? //類(lèi)構(gòu)造函數(shù)(用于實(shí)現(xiàn)程序的主體部份)
? ? public slots:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有的槽函數(shù)都必須申明public slots語(yǔ)句內(nèi)
? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個(gè)槽函數(shù)用于顯應(yīng)點(diǎn)擊按鈕時(shí)改變文本框內(nèi)容
? ? ? ? ? void SlotTest2();? ? ? ? ? ? ? ? ? ? //新增加槽函數(shù),用于將文本框內(nèi)容改為SigSig
? private:
? ? ? ? QPushButton * pb;? ? ? ? ? ? ? ? ? ? //申請(qǐng)一個(gè)按鈕QPushButton
? ? ? ? QLineEdit * ledit;? ? ? ? ? ? ? ? ? ? ? //申請(qǐng)一個(gè)文本框ledit
? ? ? ? QLabel * label;? ? ? ? ? ? ? ? ? ? ? ? //申請(qǐng)一個(gè)文本標(biāo)簽label
? ?? Signals:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有信號(hào)都需要申明在signals語(yǔ)句內(nèi)
? ?? ? void SigTest()? ? ? ? ? ? ? ? ? ? ? ? //新增加信號(hào)SigTest()。
? ? };?
? ? #endif /* YOURClASS_H_ */? ?
? ? 在這個(gè)例子中,我們加入了自定義的信號(hào)SigTest()。在QT中信號(hào)的申請(qǐng)方法是,在類(lèi)中加入signals(信號(hào))語(yǔ)句。然后在語(yǔ)句后面定義自己的信號(hào)函數(shù)就可以了。有趣的是信號(hào)的定義并不需要具體實(shí)現(xiàn),它就像一系列函數(shù)原型一樣。你只需要申請(qǐng)就可以了。本例中,我們申請(qǐng)了一個(gè)不帶有任何參數(shù)的信號(hào)SigTest()。在下文中我們將用這個(gè)信號(hào)來(lái)實(shí)現(xiàn)文本框內(nèi)容變化。
? ? 在窗體上要繪制文本標(biāo)簽,就必須加入<QLabel>頭文件。其次我們?cè)诖a中新增加了一個(gè)槽SlotTest2()函數(shù)和一個(gè)信號(hào)SigTest()函數(shù),并通過(guò)connect()函數(shù)連接。
? ? 代碼如下所示(yourclass.cpp):
Copy code
#include "yourclass.h"

MyMainWindows::MyMainWindows()
{
? setGeometry(90,90,300,200);
? pb = new QPushButton("Modify",this);
? pb->setGeometry(10,10,100,20);
? ledit = new QLineEdit("what's your name",this);
? ledit->setGeometry(10,30,200,150);
? label = new QLabel("My MeMe",this);? ? ? ? ? ? ? ? //實(shí)現(xiàn)一個(gè)文本標(biāo)簽label,并將其內(nèi)容初使為:My MeMe
? label->setGeometry(115,10,100,20);
? connect(pb,SIGNAL(clicked()),this,SLOT(SlotTest()));?
? connect(this,SIGNAL(SigTest()),this,SLOT(SlotTest2())); //連接自定義信號(hào)SigTest? ()和SlotTest2()槽函數(shù)
}
void MyMainWindows::SlotTest()? ? ? ? ? ? ? ? ? ? ? //信號(hào)1
{
? ledit->setText("jingjing");
? label->setText("TTT");? ? ? ? ? ? ? ? ? ? ? ? ? //將文本標(biāo)簽label內(nèi)容設(shè)置為T(mén)TT文本
? if(label->text() != "My MeMe")
? ? {
? ? ? emit SigTest();
? ? }
}

void MyMainWindows::SlotTest2()? ? ? ? ? ? ? //信號(hào)2
{
? ledit->setText("SigSig");? //設(shè)置文本框內(nèi)容為SigSig
}
? ? 從上面代碼中可以看出,首先我們?cè)贛yMainWindows()主窗體類(lèi)構(gòu)造函數(shù)中加入了
? ?? ?
Copy code
label = new QLabel("My MeMe",this);? ? ? ? ? ? ?
? ?? ? label->setGeometry(115,10,100,20);
? ? Label文本標(biāo)簽的初使內(nèi)容為My MeMe。其位置為窗體的(115,10),大小為(100,20),我們?cè)谏弦皇吕兄v過(guò)的槽函數(shù)SlotTest()中新加入了對(duì)文本標(biāo)簽的檢測(cè),來(lái)達(dá)到對(duì)我們自定義信號(hào)SigTest()觸發(fā)。如下所示:
Copy code
void MyMainWindows::SlotTest()? ? ? ? ? ? ? ? ? ? ? //信號(hào)1
{
? ledit->setText("jingjing");
? label->setText("TTT");? ? ? ? ? ? ? ? ? ? ? ? ? //將文本標(biāo)簽label內(nèi)容設(shè)置為T(mén)TT文本
? if(label->text() != "My MeMe")
? ? {
? ? ? emit SigTest();
? ? }
}

void MyMainWindows::SlotTest2()? ? ? ? ? ? ? //信號(hào)2
{
? ledit->setText("SigSig");? //設(shè)置文本框內(nèi)容為SigSig
}
? ? 如代碼所示當(dāng)SlotTest()槽函數(shù)被調(diào)用時(shí),首先將ledit文本框內(nèi)容設(shè)為jingjing,并把label文本標(biāo)簽內(nèi)容設(shè)為T(mén)TT,然后此時(shí)我們檢測(cè)label的內(nèi)容是不是還為它的初使內(nèi)容My MeMe,如果不是,則引發(fā)我們自定義的SigTest()信號(hào)。請(qǐng)注意代碼中emit(發(fā)射)關(guān)鍵字,做為QT信號(hào)與槽機(jī)制來(lái)說(shuō),emit的作用就是將信號(hào)發(fā)出來(lái)的意思。也就是說(shuō),當(dāng)我們類(lèi)申明文件中定義了一個(gè)信號(hào)時(shí),如果要使用這個(gè)信號(hào),只需在信號(hào)語(yǔ)句前面加上emit關(guān)鍵字就可以了。
? ? 而在SlotTest2()槽函數(shù)中,我們把文本框ledit的內(nèi)容設(shè)為:SigSig。也就是當(dāng)SlotTest2()槽函數(shù)被調(diào)用時(shí)就又會(huì)把ledit中內(nèi)容修改為SigSig。在本事例中,我們用SigTest()信號(hào)來(lái)連接SlotTest2()這個(gè)槽,也就是說(shuō)當(dāng)SigTest()信號(hào)被觸發(fā)時(shí),就會(huì)將文本框的內(nèi)容修改為:SigSig。代碼如下:
Copy code
connect(this,SIGNAL(SigTest()),this,SLOT(SlotTest2()));

? ? 現(xiàn)在讓我們把上例中的Main.cpp文件放到一起,進(jìn)行編譯
? ? 當(dāng)?shù)谝淮吸c(diǎn)擊[Modify]按鈕時(shí),程序首先產(chǎn)生一個(gè)信號(hào)clicked(),而這個(gè)信號(hào)將導(dǎo)致SlotTest()槽被執(zhí)行,文本框的內(nèi)容首先被修改為jingjing,然后label文本標(biāo)簽的內(nèi)容被修改為T(mén)TT,隨后在SlotTest()語(yǔ)句發(fā)現(xiàn)label的內(nèi)容不是My MeMe,因此向外發(fā)射信號(hào)SigTest()。而SigTest()信號(hào)與SlotTest2()槽連接,因此導(dǎo)致SlotTest2()槽函數(shù)被調(diào)用,它又將文本框內(nèi)容修改為了SigSig。因此當(dāng)我們點(diǎn)擊Modify時(shí),文本框內(nèi)容最終會(huì)變?yōu)镾igSig文本。

轉(zhuǎn)載于:https://www.cnblogs.com/si-ren/archive/2010/05/09/2447740.html

總結(jié)

以上是生活随笔為你收集整理的QT4 自定义槽和信号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。