QT4 自定义槽和信号
生活随笔
收集整理的這篇文章主要介紹了
QT4 自定义槽和信号
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
QT4 自定義槽和信號
本文所示代碼在windows xp + MingW3.4.2+ eclipse3.4+CDT5.0版本中調試通過
? ? QT系統為我們提供功能非常全面信號處理機制,它的內制信號和槽已經非常全面,因此大多數情況下,我們不需要自己設計信號和槽,但是有些時候,我們可能需要設計一些獨特的信號和槽,來滿足程序的需求。QT的核心機制信號和槽是獨立于C++的,一般C++設計處理如按鈕點擊等方法,多采用回調函數,而回調函數設計上的復雜,雖然執行效率相對于QT信號與槽要高,但是其導制容易出錯。況且在日常應用程序設計中來說,這種高效率相差不成比例,因此QT采用自己獨門設計,來高效的編程。本文也同樣倡導大家使用信號與槽。
? ? 如何才能設計自己的信號和槽呢,閱讀完本節您將會輕松實現自己的需求。
? ? 在創建信號和槽之前首先大家需要建立三個文件:類申明文件(yourclass.h),類實現文件(youclass.cpp),程序主體文件(main.cpp)。
? ? 請看下面的例子,假設我們需要一個來處理文本框的內容的程序,程序主界面有兩個按鈕,當們點擊按鈕[Modify]時,文本框內容被改為“jingjing”。
1、自定義槽:
? ? 按鈕點擊信號clilcked()通過繼承已經存在,因此我們暫時不需要定義這個信號。那么我們要改變文本框內容,就需要自己定義一個槽,來響應點擊信號。
? ? 示例代碼(類申明文件 yourclass.h):
? ? #define YOURCLASS_H_
? ? #include <QWidget>? ? ? ? ? ? ? ? ? ? ? ? //QT窗口應用程序需要包含的文件
? ? #include <QPushButton>? ? ? ? ? ? ? ? ? ? //制作按鈕時,需要包含
? ? #include <QLineEdit>? ? ? ? ? ? ? ? ? ? ? //制作文本框時,需要包含
? ? class MyMainWindows:public QWidget? ? ? ? //申明一個MyMainWindows類,這個類用于實現窗體
? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?? Q_OBJECT? ? ? ? ? ? ? ? ? ? ? ? ? ? //Q_OBJECT是在定制信號和槽和必須包含的一條宏語句
? ? public:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? MyMainWindows();? ? ? ? ? ? ? ? ? ? //類構造函數(用于實現程序的主體部份)
? ? public slots:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有的槽函數都必須申明public slots語句內
? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個槽函數用于顯應點擊按鈕時改變文本框內容
? ? private:
? ? ? ? QPushButton * pb;? ? ? ? ? ? ? ? ? ? //申請一個按鈕QPushButton
? ? ? ? QLineEdit * ledit;? ? ? ? ? ? ? ? ? ? ? //申請一個文本框ledit
? ? };
? ? #endif /* YOURClASS_H_ */? ?
? ? 在上面的示例代碼中,我們申明了一窗口應用程序類文件,它的功能是申明程序所需要全部元素信息。在這個類中,我們申明了自己的槽SlotTest()函數,來響應按鈕點擊的信號。如下所示:
? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個槽函數用于顯應點擊按鈕時改變文本框內容
? ? 正如代碼中注釋說明,在自定義槽和信號是有兩點是至關重要的:
? ? 第一點:所有的槽函數都需要包含在public slots語句下面。它的申明和類的公有函數方法pulic是類似的。如果你有多個槽函數,只要需要一一列出即可。
? ? 第二點;在類的文件開始部份應含Q_OBJECT宏語句,請記住它不需要標點符號,所以不要加[;]符號。所有的QT自定義槽和信號都需要有它的存在。
? ? 下面是制作第二個文件:類實現文件yourclass.cpp。在這個文件用于yourclass.h中申明的元素實現部份。
? ? 示例代碼(類實現文件yourclass.cpp)
MyMainWindows::MyMainWindows()? ? ? ? ? ? ? ? ? ? //實現構造函數
{
? setGeometry(90,90,300,200);? ? ? ? ? ? ? ? ? ? ? ? ? //繪制主窗體,大小為300X200
? pb = new QPushButton("Modify",this);? ? ? ? ? ? ? ? ? //實現pb按鈕,被設計其名字為Modify
? pb->setGeometry(10,10,100,20);? ? ? ? ? ? ? ? ? ? ? ? //繪制pb按鈕的位置(10,10)和大小(100,20)
? ledit = new QLineEdit("what's your name",this);? ? ? ? ? //實現ledit文件框,其內容為what's your name
? ledit->setGeometry(10,30,200,150);? ? ? ? ? ? ? ? ? ? //繪制ledit文件框位置(10,30)和大小(200,150)
? connect(pb,SIGNAL(clicked()),this,SLOT(SlotTest()));? ? //連接pb按鈕的點擊clicked()信號和自定義槽SlotTest()
}
void MyMainWindows::SlotTest()? ? ? ? ? ? ? ? ? ? ? ? //自定義槽函數的實現方法,重置文本框的內容
{
? ledit->setText("jingjing");? ? ? ? ? ? ? ? ? ? ? ? ? ? //“jingjing”為點擊按鈕Modify后的內容
}
在yourclass.cpp中,我們實現了程序的全部功能,程序的執行還需要有一個入口。它的主體部分mian.cpp。
#include "yourclass.h"? ? ? ? ? ? ? ? //包含類定義文件yourclass.h
int main(int argc,char * argv[])
{
? QApplication app(argc,argv);? ? ? ? //申明一個QT應用程序對像app
? MyMainWindows w;? ? ? ? ? ? ? ? ? ? ? //申明我們實現MyMainWindows窗體對像 w.
? w.show();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //顯示這個w 窗體
? return app.exec();
}
程序編譯完成后執行當點擊Modify按鈕,文本內容what's your name 被修改為jingjing
2、自定義信號
? ? 在上例中,我們了解了怎樣來實現自己的槽函數,在下文中我們將介紹怎么實現自己的信號。QT信號的申明與實現,相對QT槽函數來說,要更加容易一些。它相當于一系列函數原型。不需要有具體實現處理內容。在上文中,我們是通過點擊clicked()這個信號,來連接槽函數SlotTest(),并達到修改文本框的內容。本例中,我們將在窗體添加一個文字標簽label,然后在槽函數SlotTest()中測試label內容是否發生變化,如果發生了變化,就引發信號SigTest()。該信號連接到槽函數SlotTest2(),將文本框內容修改為"SigSig"。
? ? 下面為實現文件:
? ? 請打開上節中的yourclass.h文件,在代碼加入一個槽函數SlotTest2(),和一個信號SigTest()。紅色代碼為新增加內容,如下所示:
? ? #define YOURCLASS_H_
? ? #include <QWidget>? ? ? ? ? ? ? ? ? ? ? ? //QT窗口應用程序需要包含的文件
? ? #include <QPushButton>? ? ? ? ? ? ? ? ? ? //制作按鈕時,需要包含
? ? #include <QLineEdit>? ? ? ? ? ? ? ? ? ? ? //制作文本框時,需要包含
? ? #include <QLabel>? ? ? ? ? ? ? ? ? ? ? ? //制作文本標簽時,需要包含
? ? class MyMainWindows:public QWidget? ? ? ? //申明一個MyMainWindows類,這個類用于實現窗體
? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?? Q_OBJECT? ? ? ? ? ? ? ? ? ? ? ? ? ? //Q_OBJECT是在定制信號和槽和必須包含的一條宏語句
? ? public:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? MyMainWindows();? ? ? ? ? ? ? ? ? ? //類構造函數(用于實現程序的主體部份)
? ? public slots:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有的槽函數都必須申明public slots語句內
? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個槽函數用于顯應點擊按鈕時改變文本框內容
? ? ? ? ? void SlotTest2();? ? ? ? ? ? ? ? ? ? //新增加槽函數,用于將文本框內容改為SigSig
? private:
? ? ? ? QPushButton * pb;? ? ? ? ? ? ? ? ? ? //申請一個按鈕QPushButton
? ? ? ? QLineEdit * ledit;? ? ? ? ? ? ? ? ? ? ? //申請一個文本框ledit
? ? ? ? QLabel * label;? ? ? ? ? ? ? ? ? ? ? ? //申請一個文本標簽label
? ?? Signals:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有信號都需要申明在signals語句內
? ?? ? void SigTest()? ? ? ? ? ? ? ? ? ? ? ? //新增加信號SigTest()。
? ? };?
? ? #endif /* YOURClASS_H_ */? ?
? ? 在這個例子中,我們加入了自定義的信號SigTest()。在QT中信號的申請方法是,在類中加入signals(信號)語句。然后在語句后面定義自己的信號函數就可以了。有趣的是信號的定義并不需要具體實現,它就像一系列函數原型一樣。你只需要申請就可以了。本例中,我們申請了一個不帶有任何參數的信號SigTest()。在下文中我們將用這個信號來實現文本框內容變化。
? ? 在窗體上要繪制文本標簽,就必須加入<QLabel>頭文件。其次我們在代碼中新增加了一個槽SlotTest2()函數和一個信號SigTest()函數,并通過connect()函數連接。
? ? 代碼如下所示(yourclass.cpp):
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);? ? ? ? ? ? ? ? //實現一個文本標簽label,并將其內容初使為:My MeMe
? label->setGeometry(115,10,100,20);
? connect(pb,SIGNAL(clicked()),this,SLOT(SlotTest()));?
? connect(this,SIGNAL(SigTest()),this,SLOT(SlotTest2())); //連接自定義信號SigTest? ()和SlotTest2()槽函數
}
void MyMainWindows::SlotTest()? ? ? ? ? ? ? ? ? ? ? //信號1
{
? ledit->setText("jingjing");
? label->setText("TTT");? ? ? ? ? ? ? ? ? ? ? ? ? //將文本標簽label內容設置為TTT文本
? if(label->text() != "My MeMe")
? ? {
? ? ? emit SigTest();
? ? }
}
void MyMainWindows::SlotTest2()? ? ? ? ? ? ? //信號2
{
? ledit->setText("SigSig");? //設置文本框內容為SigSig
}
? ? 從上面代碼中可以看出,首先我們在MyMainWindows()主窗體類構造函數中加入了
? ?? ?
? ?? ? label->setGeometry(115,10,100,20);
? ? Label文本標簽的初使內容為My MeMe。其位置為窗體的(115,10),大小為(100,20),我們在上一事例中講過的槽函數SlotTest()中新加入了對文本標簽的檢測,來達到對我們自定義信號SigTest()觸發。如下所示:
{
? ledit->setText("jingjing");
? label->setText("TTT");? ? ? ? ? ? ? ? ? ? ? ? ? //將文本標簽label內容設置為TTT文本
? if(label->text() != "My MeMe")
? ? {
? ? ? emit SigTest();
? ? }
}
void MyMainWindows::SlotTest2()? ? ? ? ? ? ? //信號2
{
? ledit->setText("SigSig");? //設置文本框內容為SigSig
}
? ? 如代碼所示當SlotTest()槽函數被調用時,首先將ledit文本框內容設為jingjing,并把label文本標簽內容設為TTT,然后此時我們檢測label的內容是不是還為它的初使內容My MeMe,如果不是,則引發我們自定義的SigTest()信號。請注意代碼中emit(發射)關鍵字,做為QT信號與槽機制來說,emit的作用就是將信號發出來的意思。也就是說,當我們類申明文件中定義了一個信號時,如果要使用這個信號,只需在信號語句前面加上emit關鍵字就可以了。
? ? 而在SlotTest2()槽函數中,我們把文本框ledit的內容設為:SigSig。也就是當SlotTest2()槽函數被調用時就又會把ledit中內容修改為SigSig。在本事例中,我們用SigTest()信號來連接SlotTest2()這個槽,也就是說當SigTest()信號被觸發時,就會將文本框的內容修改為:SigSig。代碼如下:
? ? 現在讓我們把上例中的Main.cpp文件放到一起,進行編譯
? ? 當第一次點擊[Modify]按鈕時,程序首先產生一個信號clicked(),而這個信號將導致SlotTest()槽被執行,文本框的內容首先被修改為jingjing,然后label文本標簽的內容被修改為TTT,隨后在SlotTest()語句發現label的內容不是My MeMe,因此向外發射信號SigTest()。而SigTest()信號與SlotTest2()槽連接,因此導致SlotTest2()槽函數被調用,它又將文本框內容修改為了SigSig。因此當我們點擊Modify時,文本框內容最終會變為SigSig文本。
本文所示代碼在windows xp + MingW3.4.2+ eclipse3.4+CDT5.0版本中調試通過
? ? QT系統為我們提供功能非常全面信號處理機制,它的內制信號和槽已經非常全面,因此大多數情況下,我們不需要自己設計信號和槽,但是有些時候,我們可能需要設計一些獨特的信號和槽,來滿足程序的需求。QT的核心機制信號和槽是獨立于C++的,一般C++設計處理如按鈕點擊等方法,多采用回調函數,而回調函數設計上的復雜,雖然執行效率相對于QT信號與槽要高,但是其導制容易出錯。況且在日常應用程序設計中來說,這種高效率相差不成比例,因此QT采用自己獨門設計,來高效的編程。本文也同樣倡導大家使用信號與槽。
? ? 如何才能設計自己的信號和槽呢,閱讀完本節您將會輕松實現自己的需求。
? ? 在創建信號和槽之前首先大家需要建立三個文件:類申明文件(yourclass.h),類實現文件(youclass.cpp),程序主體文件(main.cpp)。
? ? 請看下面的例子,假設我們需要一個來處理文本框的內容的程序,程序主界面有兩個按鈕,當們點擊按鈕[Modify]時,文本框內容被改為“jingjing”。
1、自定義槽:
? ? 按鈕點擊信號clilcked()通過繼承已經存在,因此我們暫時不需要定義這個信號。那么我們要改變文本框內容,就需要自己定義一個槽,來響應點擊信號。
? ? 示例代碼(類申明文件 yourclass.h):
Copy code
#ifndef YOURCLASS_H_? ? #define YOURCLASS_H_
? ? #include <QWidget>? ? ? ? ? ? ? ? ? ? ? ? //QT窗口應用程序需要包含的文件
? ? #include <QPushButton>? ? ? ? ? ? ? ? ? ? //制作按鈕時,需要包含
? ? #include <QLineEdit>? ? ? ? ? ? ? ? ? ? ? //制作文本框時,需要包含
? ? class MyMainWindows:public QWidget? ? ? ? //申明一個MyMainWindows類,這個類用于實現窗體
? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?? Q_OBJECT? ? ? ? ? ? ? ? ? ? ? ? ? ? //Q_OBJECT是在定制信號和槽和必須包含的一條宏語句
? ? public:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? MyMainWindows();? ? ? ? ? ? ? ? ? ? //類構造函數(用于實現程序的主體部份)
? ? public slots:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有的槽函數都必須申明public slots語句內
? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個槽函數用于顯應點擊按鈕時改變文本框內容
? ? private:
? ? ? ? QPushButton * pb;? ? ? ? ? ? ? ? ? ? //申請一個按鈕QPushButton
? ? ? ? QLineEdit * ledit;? ? ? ? ? ? ? ? ? ? ? //申請一個文本框ledit
? ? };
? ? #endif /* YOURClASS_H_ */? ?
? ? 在上面的示例代碼中,我們申明了一窗口應用程序類文件,它的功能是申明程序所需要全部元素信息。在這個類中,我們申明了自己的槽SlotTest()函數,來響應按鈕點擊的信號。如下所示:
Copy code
public slots:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有的槽函數都必須申明public slots語句內? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個槽函數用于顯應點擊按鈕時改變文本框內容
? ? 正如代碼中注釋說明,在自定義槽和信號是有兩點是至關重要的:
? ? 第一點:所有的槽函數都需要包含在public slots語句下面。它的申明和類的公有函數方法pulic是類似的。如果你有多個槽函數,只要需要一一列出即可。
? ? 第二點;在類的文件開始部份應含Q_OBJECT宏語句,請記住它不需要標點符號,所以不要加[;]符號。所有的QT自定義槽和信號都需要有它的存在。
? ? 下面是制作第二個文件:類實現文件yourclass.cpp。在這個文件用于yourclass.h中申明的元素實現部份。
? ? 示例代碼(類實現文件yourclass.cpp)
Copy code
#include "yourclass.h"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //包含yourclass.h類申明文件MyMainWindows::MyMainWindows()? ? ? ? ? ? ? ? ? ? //實現構造函數
{
? setGeometry(90,90,300,200);? ? ? ? ? ? ? ? ? ? ? ? ? //繪制主窗體,大小為300X200
? pb = new QPushButton("Modify",this);? ? ? ? ? ? ? ? ? //實現pb按鈕,被設計其名字為Modify
? pb->setGeometry(10,10,100,20);? ? ? ? ? ? ? ? ? ? ? ? //繪制pb按鈕的位置(10,10)和大小(100,20)
? ledit = new QLineEdit("what's your name",this);? ? ? ? ? //實現ledit文件框,其內容為what's your name
? ledit->setGeometry(10,30,200,150);? ? ? ? ? ? ? ? ? ? //繪制ledit文件框位置(10,30)和大小(200,150)
? connect(pb,SIGNAL(clicked()),this,SLOT(SlotTest()));? ? //連接pb按鈕的點擊clicked()信號和自定義槽SlotTest()
}
void MyMainWindows::SlotTest()? ? ? ? ? ? ? ? ? ? ? ? //自定義槽函數的實現方法,重置文本框的內容
{
? ledit->setText("jingjing");? ? ? ? ? ? ? ? ? ? ? ? ? ? //“jingjing”為點擊按鈕Modify后的內容
}
在yourclass.cpp中,我們實現了程序的全部功能,程序的執行還需要有一個入口。它的主體部分mian.cpp。
Copy code
#include <QApplication>? ? ? ? ? ? ? //所有QT應用程序都要包含QApplication頭文件#include "yourclass.h"? ? ? ? ? ? ? ? //包含類定義文件yourclass.h
int main(int argc,char * argv[])
{
? QApplication app(argc,argv);? ? ? ? //申明一個QT應用程序對像app
? MyMainWindows w;? ? ? ? ? ? ? ? ? ? ? //申明我們實現MyMainWindows窗體對像 w.
? w.show();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //顯示這個w 窗體
? return app.exec();
}
程序編譯完成后執行當點擊Modify按鈕,文本內容what's your name 被修改為jingjing
2、自定義信號
? ? 在上例中,我們了解了怎樣來實現自己的槽函數,在下文中我們將介紹怎么實現自己的信號。QT信號的申明與實現,相對QT槽函數來說,要更加容易一些。它相當于一系列函數原型。不需要有具體實現處理內容。在上文中,我們是通過點擊clicked()這個信號,來連接槽函數SlotTest(),并達到修改文本框的內容。本例中,我們將在窗體添加一個文字標簽label,然后在槽函數SlotTest()中測試label內容是否發生變化,如果發生了變化,就引發信號SigTest()。該信號連接到槽函數SlotTest2(),將文本框內容修改為"SigSig"。
? ? 下面為實現文件:
? ? 請打開上節中的yourclass.h文件,在代碼加入一個槽函數SlotTest2(),和一個信號SigTest()。紅色代碼為新增加內容,如下所示:
Copy code
#ifndef YOURCLASS_H_? ? #define YOURCLASS_H_
? ? #include <QWidget>? ? ? ? ? ? ? ? ? ? ? ? //QT窗口應用程序需要包含的文件
? ? #include <QPushButton>? ? ? ? ? ? ? ? ? ? //制作按鈕時,需要包含
? ? #include <QLineEdit>? ? ? ? ? ? ? ? ? ? ? //制作文本框時,需要包含
? ? #include <QLabel>? ? ? ? ? ? ? ? ? ? ? ? //制作文本標簽時,需要包含
? ? class MyMainWindows:public QWidget? ? ? ? //申明一個MyMainWindows類,這個類用于實現窗體
? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?? Q_OBJECT? ? ? ? ? ? ? ? ? ? ? ? ? ? //Q_OBJECT是在定制信號和槽和必須包含的一條宏語句
? ? public:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? MyMainWindows();? ? ? ? ? ? ? ? ? ? //類構造函數(用于實現程序的主體部份)
? ? public slots:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有的槽函數都必須申明public slots語句內
? ? ? ? ? void SlotTest();? ? ? ? ? ? ? ? ? ? //這個槽函數用于顯應點擊按鈕時改變文本框內容
? ? ? ? ? void SlotTest2();? ? ? ? ? ? ? ? ? ? //新增加槽函數,用于將文本框內容改為SigSig
? private:
? ? ? ? QPushButton * pb;? ? ? ? ? ? ? ? ? ? //申請一個按鈕QPushButton
? ? ? ? QLineEdit * ledit;? ? ? ? ? ? ? ? ? ? ? //申請一個文本框ledit
? ? ? ? QLabel * label;? ? ? ? ? ? ? ? ? ? ? ? //申請一個文本標簽label
? ?? Signals:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //所有信號都需要申明在signals語句內
? ?? ? void SigTest()? ? ? ? ? ? ? ? ? ? ? ? //新增加信號SigTest()。
? ? };?
? ? #endif /* YOURClASS_H_ */? ?
? ? 在這個例子中,我們加入了自定義的信號SigTest()。在QT中信號的申請方法是,在類中加入signals(信號)語句。然后在語句后面定義自己的信號函數就可以了。有趣的是信號的定義并不需要具體實現,它就像一系列函數原型一樣。你只需要申請就可以了。本例中,我們申請了一個不帶有任何參數的信號SigTest()。在下文中我們將用這個信號來實現文本框內容變化。
? ? 在窗體上要繪制文本標簽,就必須加入<QLabel>頭文件。其次我們在代碼中新增加了一個槽SlotTest2()函數和一個信號SigTest()函數,并通過connect()函數連接。
? ? 代碼如下所示(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);? ? ? ? ? ? ? ? //實現一個文本標簽label,并將其內容初使為:My MeMe
? label->setGeometry(115,10,100,20);
? connect(pb,SIGNAL(clicked()),this,SLOT(SlotTest()));?
? connect(this,SIGNAL(SigTest()),this,SLOT(SlotTest2())); //連接自定義信號SigTest? ()和SlotTest2()槽函數
}
void MyMainWindows::SlotTest()? ? ? ? ? ? ? ? ? ? ? //信號1
{
? ledit->setText("jingjing");
? label->setText("TTT");? ? ? ? ? ? ? ? ? ? ? ? ? //將文本標簽label內容設置為TTT文本
? if(label->text() != "My MeMe")
? ? {
? ? ? emit SigTest();
? ? }
}
void MyMainWindows::SlotTest2()? ? ? ? ? ? ? //信號2
{
? ledit->setText("SigSig");? //設置文本框內容為SigSig
}
? ? 從上面代碼中可以看出,首先我們在MyMainWindows()主窗體類構造函數中加入了
? ?? ?
Copy code
label = new QLabel("My MeMe",this);? ? ? ? ? ? ?? ?? ? label->setGeometry(115,10,100,20);
? ? Label文本標簽的初使內容為My MeMe。其位置為窗體的(115,10),大小為(100,20),我們在上一事例中講過的槽函數SlotTest()中新加入了對文本標簽的檢測,來達到對我們自定義信號SigTest()觸發。如下所示:
Copy code
void MyMainWindows::SlotTest()? ? ? ? ? ? ? ? ? ? ? //信號1{
? ledit->setText("jingjing");
? label->setText("TTT");? ? ? ? ? ? ? ? ? ? ? ? ? //將文本標簽label內容設置為TTT文本
? if(label->text() != "My MeMe")
? ? {
? ? ? emit SigTest();
? ? }
}
void MyMainWindows::SlotTest2()? ? ? ? ? ? ? //信號2
{
? ledit->setText("SigSig");? //設置文本框內容為SigSig
}
? ? 如代碼所示當SlotTest()槽函數被調用時,首先將ledit文本框內容設為jingjing,并把label文本標簽內容設為TTT,然后此時我們檢測label的內容是不是還為它的初使內容My MeMe,如果不是,則引發我們自定義的SigTest()信號。請注意代碼中emit(發射)關鍵字,做為QT信號與槽機制來說,emit的作用就是將信號發出來的意思。也就是說,當我們類申明文件中定義了一個信號時,如果要使用這個信號,只需在信號語句前面加上emit關鍵字就可以了。
? ? 而在SlotTest2()槽函數中,我們把文本框ledit的內容設為:SigSig。也就是當SlotTest2()槽函數被調用時就又會把ledit中內容修改為SigSig。在本事例中,我們用SigTest()信號來連接SlotTest2()這個槽,也就是說當SigTest()信號被觸發時,就會將文本框的內容修改為:SigSig。代碼如下:
Copy code
connect(this,SIGNAL(SigTest()),this,SLOT(SlotTest2()));? ? 現在讓我們把上例中的Main.cpp文件放到一起,進行編譯
? ? 當第一次點擊[Modify]按鈕時,程序首先產生一個信號clicked(),而這個信號將導致SlotTest()槽被執行,文本框的內容首先被修改為jingjing,然后label文本標簽的內容被修改為TTT,隨后在SlotTest()語句發現label的內容不是My MeMe,因此向外發射信號SigTest()。而SigTest()信號與SlotTest2()槽連接,因此導致SlotTest2()槽函數被調用,它又將文本框內容修改為了SigSig。因此當我們點擊Modify時,文本框內容最終會變為SigSig文本。
轉載于:https://www.cnblogs.com/si-ren/archive/2010/05/09/2447740.html
總結
以上是生活随笔為你收集整理的QT4 自定义槽和信号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery遮罩层(转)
- 下一篇: C++ Primer ----- 关于初