在使用QT之前,或許我是習(xí)慣了MFC的消息傳遞機(jī)制,所以覺得事件伴隨著全部的觸發(fā)信息是理所當(dāng)然,但這顯然讓我又讓我自己欺騙了自己。在MFC下,通過分析事件傳遞的wParam和lParam就可以很方便的得到事件的信息,但在QT信號和槽的機(jī)制下,如果是初學(xué)者的您可能會(huì)跟我一樣感到無所適從。
大多使用過QT的人都知道,信號和槽的機(jī)制貫穿了整個(gè)QT的框架,雖說理解起來并不困難,但是在使用它的時(shí)候確是大有文章。例如,我們在單擊了一個(gè)button時(shí),我們想得到關(guān)于這個(gè)button的相關(guān)信息,比如button的text,icon,等等所有與這button相關(guān)的信息,下面我就舉例說明一下我解決這問題的方法。您可能有更好的方法,如果您不介意的話,我希望您能奉獻(xiàn)給大家,這其中當(dāng)然包括我,或者給留下相關(guān)的鏈接地址,我十分高興與您討論。這種情況在MFC下通過映射之后利用wParam可能就能得到想要的結(jié)果,但是在QT中,好像表達(dá)的并沒有那么明顯。我就拿QPushButton來舉例子,其他的類似。
在QT助手中提供的信息是這樣的,QPushButton提供了6個(gè)信號,分別為繼承自QAbstractButton所擁有的
void clicked ( bool checked = false) //按鈕被鼠標(biāo)點(diǎn)擊時(shí)的信號
void pressed () //按鈕被按下時(shí)的信號
void released () //按鈕被釋放時(shí)的信號
void toggled ( bool checked ) //按鈕狀態(tài)發(fā)生改變時(shí)的信號(一般也就指被按下或者被彈起)
QWidget所擁有的void customContextMenuRequested ( const QPoint & pos )和QObject所擁有的void destroyed ( QObject * obj = 0 ),這兩個(gè)是QWidget本身所擁有的屬性,這里就不做討論了。
一看這四種信號只有兩個(gè)傳遞了button的狀態(tài),而這兩個(gè)狀態(tài)也只是指示了按鈕是否被按下的狀態(tài),但是我要得到按鈕上的文字,這可怎么辦呀?我是這么做的:
首先,我從QPushButton派生出一個(gè)自己的PushButton
//MyButton.h
#include <QtGui/QPushButton>
class MyButton : public QPushButton
{
Q_OBJECT
public:
MyButton(QWidget *parent = 0);
~MyButton();
signals:
void ReturnText(const QString &itemtext); //這里只能在頭文件里面聲明,cpp文件里不需定義
public slots:
void SendItemText(); //給自己的BUTTON多添加一個(gè)用于響應(yīng)的槽
};
//MyButton.cpp
#include "MyButton.h"
MyButton::MyButton(QWidget *parent):QPushButton(parent)
{
//在我的button初始化的時(shí)候就連接好clicked的事件,并對應(yīng)自己所要響應(yīng)的槽
connect(this,SIGNAL(clicked()),this,SLOT(SendItemText()));
}
MyButton::~MyButton()
{
}
void MyButton::SendItemText()
{
//當(dāng)鼠標(biāo)點(diǎn)擊我的button時(shí),button會(huì)做出響應(yīng)并把自己的text發(fā)送到ReturnText的這個(gè)事件上
emit ReturnText(this->text());
}
在之前RuturnText上,QT會(huì)自動(dòng)將你所發(fā)射的信息關(guān)聯(lián)到所對應(yīng)的信號上,如果你試圖自己去寫ReturnText的實(shí)現(xiàn)函數(shù),那么程序?qū)⒃诰幾g時(shí)報(bào)錯(cuò)。
接下來我們就可以使用我們需要的東西了,我們先創(chuàng)建一個(gè)對話框:
//MyDialog.h
#include <QtGui/QDialog>
class QVBoxLayout;
class QLabel;
class MyButton;
class MyDialog :public QDialog
{
Q_OBJECT
public:
MyDialog(QWidget *parent = 0);
~MyDialog(void);
public slots:
void LabelText(const QString &);
private:
QVBoxLayout *layout;
QLabel *label;
MyButton *btn;
};
//MyDialog.cpp
#include "MyDialog.h"
#include "MyButton.h"
#include <QtGui/QVBoxLayout>
#include <QtGui/QLabel>
MyDialog::MyDialog(QWidget *parent):QDialog(parent)
{
layout=new QVBoxLayout(this);
label=new QLabel;
btn=new MyButton(this);
btn->setText("text");
btn->setFixedSize(QSize(200,30));
label->setFixedSize(QSize(200,30));
layout->addWidget(label);
layout->addWidget(btn);
//在這里再與要顯示的部件連接,這是就可以傳遞我們需要的信息了
connect(btn,SIGNAL(ReturnText(const QString &)),this,SLOT(LabelText(const QString &)));
}
MyDialog::~MyDialog(void)
{
delete btn;
btn=NULL;
delete label;
label=NULL;
delete layout;
layout=NULL;
}
void MyDialog::LabelText(const QString &btnText)
{
//將得到的信息顯示出來
this->label->setText(btnText);
}
最后,main函數(shù),這個(gè)沒什么特別:
#include <QtGui/QApplication>
#include "MyDialog.h"
int main(int argc,char** argv)
{
QApplication app(argc,argv);
MyDialog dialog;
dialog.show();
return app.exec();
}
好了,這里只傳遞了text,它還能做很多工作,您自己試試吧,希望對您有用并祝一切順利。
以上程序在本機(jī)編譯運(yùn)行通過。vc2008+QT4.4.2.