【转】QT中自定义的信号和槽

原文地址  ==> http://wenku.baidu.com/view/96bae5dc5022aaea998f0f0f.html

 

QT 中自定义的信号和槽

使用自定义的信号和槽,需要注意以下几点:
1、类的声明和实现分别放在 .h 和 .cpp 文件中;
2、类声明中包含 Q_OBJECT 宏;
3、信号只要声明不要设计其的实现函数;
4、发射信号用 emit 关键字;
5、自定义槽的实现与普通成员函数的实现一样。
 
当程序中所使用的类中具有用户自定义的槽和信号时,你需要使用 moc  (元对象编译器)对程序进行编译。
编译方法一:
你可以将 moc 文件编译为目标文件,之后把它与 ClassDefinion.cpp 和 main.cpp 一起链接,下面具体的操作步骤:
#moc ClassDeclaration.h -o ClassDeclaration.cpp
#g++ -c ClassDeclaration.cpp -o ClassDeclaration.o
#g++ -c ClassDefinion.cpp -o ClassDefinion.o
#g++ -c main.cpp -o main.o
#g++ -lqt ClassDefinion.o ClassDeclaration.o main.o -o MyProgram

编译方法二:
创建一个空的文件夹,把源文件 ClassDeclaration.h,ClassDefinion.cpp 和 main.cpp 放入其中,执行以下命令:
#qmake -project
#qmake
#make

完成上述步骤后,就生成可执行文件了(可执行文件的名与你所创建的文件夹的名称相同),我们就可以运行它了。
 
创建用户自定义的信号与槽的具体步骤:
首先你需要在类声明中声明自定义的信号和槽。在关键字 public slots: 下声明自定义槽;在 signals: 关键字下声明自定义的信号。如下例所示:

class MyMainWindow : public QWidget
{
    Q_OBJECT
public:
    void MyMainWindow();
    void SetValue(int);

signals:
    void ValueChanged(int);

public slots:
    void ChangeValue(int);
};

正如你可能猜想到的,只有当一个新的值传递给SetValue()函数时,SetValue()函数才应该调用ValueChanged()信号。之后,通过将ValueChanged()信号连接到ChangeValue()槽,使得当有新值传递给SetValue()函数时,能够引起数值的变化。多数情况下,这是不必要的,但它演示了信号的使用方法。SetValue()函数可以像下面格式实现:
 
void MyMainWindow::SetValue(int value)
{
    if(value!=oldvalue)
    {
        oldvalue=value;
        emit ValueChanged(value);
    }
}

如你看到的只有,当新值与旧值不同时才发射ValueChanged()信号,且oldvalue将被修改为value。应注意的是,信号与槽一类的普通函数不同,它只能使用emit关键字发射。ChangeValue()可定义为:

void MyMainWindow::ChangeValue(int value)
{
    FunctionForChangingTheValue(value);
}

在这段代码中,调用 FunctionForChangingTheValue( )函数去修改数据。你需要做的最后一件事是将信号和槽连接起来:

connect(this,SIGNAL(ValueChanged(int)),this,SLOT(ChangeValue(int)));

这个例子的功能是当调用SetValue()函数时,检查新值是否等于旧值。如果不等,则发射ValueChanged()信号,又因为 ValueChanged()信号被连接到ChangeValue槽,因此当发射ValueChanged()信号时将执行ChangeValue() 槽。之后,ChangeValue()槽调用FunctionForChangingTheValue()函数去修改实际数据。

 

****************************************************************************************************

 

以下内容摘自 Qt 4.2 白皮书,关于信号与槽的官方介绍:

发生事件时,Qt 窗体将会发出信号。例如,单击某一按钮时,该按钮将发出“clicked”信号。编程人员要想连接一个信号可以创建一个函数(即“槽”)、并调用 connect() 函数将信号与槽关联起来。Qt 的信号和槽机制不要求各类彼此感知,这样可以更轻松地开发极易重新使用的类。由于信号和槽都属于类型安全的,因此,类型错误都将报告为警告,因此不会发生崩溃。

例如,如果“退出”按钮的 clicked() 信号与应用程序的 quit() 槽相连,那么如果用户单击“退出”,则会终止该应用程序。如果以代码形式表示,则应将上述过程编写为:

connect(button, SIGNAL(clicked()), qApp, SLOT(quit()));

在执行 Qt 应用程序的过程中,可以随时添加或移除连接。可将连接设置为在发出信号时执行,或者排队稍后执行,可以在不同的线程的对象之间建立连接。

信号和槽通过平滑的扩展C++语法并充分利用C++的面向对象特性实现。信号和槽是类型安全的,可以重载,也可以重新实现,可以出现在类的公有区、保护区或私有区。若要使用信号和槽,必须继承 QObject 或其子类,并在类的定义中包括 Q_OBJECT 宏。信号在类的“信号区”声明,而槽则是在“公有槽区”、“保护槽区”或“私有槽区”中声明的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值