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