Qt开发(三):事件与信号
http://xizhizhu.blogspot.com/2008/11/qt_07.html
事件与信号是Qt中一个很重要的概念,用来对用户的操作等做出响应。在Qt中,信号被成为SIGNAL,响应被称为SLOT,信号和响应间需要进行多对多的绑定。此外,信号也可以和其他信号进行绑定。
先看一个例子。
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton quit("Quit");
QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
quit.show();
return app.exec();
}
当点击按钮quit后,会发出一个clicked信号,并传递给app,响应为quit,其间的关系是通过QObject::connect()函数进行绑定的。
进行绑定的函数定义如下:
static bool QObject::connect (
const QObject * sender,
const char * signal,
const QObject * receiver,
const char * method,
Qt::ConnectionType type = Qt::AutoConnection );
这里,signal就是信号,是信号发送者sender的一个函数;method就是响应,是信号接收者receiver的一个函数。因此,我们可以定义自己的信号和响应,而信号和响应可以拥有任意数量、任意类型的参数。
定义头文件如下:
#include <QObject>
#include <iostream>
using namespace std;
class Test : public QObject
{
Q_OBJECT
public:
Test()
{
m_value = 0;
}
Test(char name)
{
m_value = 0;
m_name = name;
}
public slots:
void setValue(int value)
{
m_value = value;
emit valueChanged(value); // 发出一个valueChanged信号
cout << m_name << ": " << m_value << endl;
}
signals:
void valueChanged(int newValue);
private:
int m_value;
char m_name;
};
定义源码文件如下:
#include <QApplication>
#include <QPushButton>
#include "test.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Test a('a'), b('b');
QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
a.setValue(12);
b.setValue(48);
return app.exec();
}
编译并运行该程序,就能看到如下输出:
b: 12
a: 12
b: 48
当程序运行到a.setValue时,会发出一个valueChanged信号,被b捕获,并调用b.setValue处理。但是,当b.setValue运行时,尽管也发出了valueChanged信号,但没有定义与其相关的绑定,故不会被任何SLOT捕获和处理。
[ 本帖最后由 zxz1984 于 2008-11-8 03:22 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
good!!!