Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
本文主要是对C++ GUI Programming with Qt4一书 Signals and Slots in Depth 部分的翻译
信号与插槽机制是Qt编程的基础.它可以绑定对象而不需要对象之间彼此了解。
槽类似于c++中的成员函数他可以是虚拟的,可重载的,私有的,公开的,受保护的。
不同点式槽可以链接到信号。通过这种方式可以在每次信号发射的的时候做到调用槽函数
connect()语句是这样的
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
在这里sender和receiver是指向信号对象和槽对象的指针。宏SIGNAL()和SLOTS()负责转换他们的参数到字符串。

当然一个信号可以连接到多个槽(似乎都是这样的)
connect(slider, SIGNAL(valueChanged(int)),
        spinBox, SLOT(setValue(
int)));
connect(slider, SIGNAL(valueChanged(
int)),
        
this, SLOT(updateStatusBarIndicator(int)));
同样多个信号可以连接到单个槽
例如:
connect(lcd, SIGNAL(overflow()),
        
this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()),
        
this, SLOT(handleMathError()));
除此之外信号可以连接到其他信号(见过的其他插槽系统似乎不大可以?)
connect(lineEdit, SIGNAL(textChanged(const QString &)),
        
this, SIGNAL(updateRecord(const QString &)));
需要指出的是信号信号链接和信号插槽连接时不同的
既然信号和插槽可以连接那么他们应该可以断开,如下:
disconnect(lcd, SIGNAL(overflow()),
           
this, SLOT(handleMathError()));
一个简单的例子:
class Employee : public QObject
{
    Q_OBJECT
public:
    Employee() { mySalary 
= 0; }
    
int salary() const { return mySalary; }
public slots:
    
void setSalary(int newSalary);
signals:
    
void salaryChanged(int newSalary);
private:
    
int mySalary;
};
void Employee::setSalary(int newSalary)
{
    
if (newSalary != mySalary) {
        mySalary 
= newSalary;
        emit salaryChanged(mySalary);
    }
}

 
说明
关键字 public slots:和signals
他们用于修饰插槽函数和信号函数
至于信号的反射通过关键字 emit来实现

通过本文基本掌握了QT的信号插槽机制
posted on 2011-03-15 10:34 ccsdu2009 阅读(2519) 评论(0)  编辑 收藏 引用 所属分类: QT编程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理