在使用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.