Qt中信号/槽机制

信号槽用于对象间的通讯,是观察者模式的一种实现。

1、信号

一个信号(signal)就是一个能够被观察的事件,或者至少是事件已经发生的一种通知。当事件或者状态发生改变的时候,信号就会被发出(emit);同时,信号发出者有义务调用所有注册的对这个事件(信号)感兴趣的函数(槽)。信号的声明是在头文件中进行的,需要用到关键字signal(signal是Qt中的关键字,而非C/C++中的)。信号可以重载,但信号却没有函数体定义(即在头文件中定以后,不需要在cpp文件中实现),并且信号的返回类型都是void,不要指望能从信号返回什么有用信息。

signals:
    void getString(QString msg);//不需要实现

2、槽

槽(slot)是普通的C++成员函数,唯一的特点就是可以被信号连接。一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候(也可以说是信号发出的时候)被调用的函数。只有QObject的子类才能自定义槽,定义槽的类必须在类声明的最开始处使用Q_OBJECT,类中声明槽是需要使用slots关键字,槽与所处理的信号在函数签名上必须一致。

private slots:
    void printString(QString mag);

3、信号与槽的关联

通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,当发射者对象发射信号时,接收者对象的槽函数将被调用。

connect(ff,SIGNAL(getString(QString)),this,SLOT(printString(QString)));

SIGNAL与SLOT指定的名称中可以包含参数类型,不能包含具体的参数名。信号和槽是多对多的关系。一个信号可以连接多个槽,而一个槽也可以监听多个信号。信号与槽的关联可以不必一定要放在构造函数中实现。

4、实例

以Qt中主窗体和子窗体之间的通讯为例实现信号与槽的交互

主窗体的头文件MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <Windows.h>
#include <iostream>
#include "testform.h"
using namespace std;
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public:
    openWindow();

private:
    Ui::MainWindow *ui;

    TestForm *ff;
private slots:
    void printString(QString mag);
};

#endif // MAINWINDOW_H

主窗体MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ff = new TestForm;   //初始化洪水界面
}

void MainWindow::printString(QString mag)
{
    statusBar()->showMessage(mag);  //在状态栏中显示
}


void MainWindow::openWindow()
{
    //===信号/槽连接,signal/slot连接
    connect(ff,SIGNAL(getString(QString)),this,SLOT(printString(QString)));
    ff->setWindowTitle("子窗体");
    ff->show();
}

子窗体头文件TestForm.h

#ifndef FLOODFORM_H
#define FLOODFORM_H
#include "mainwindow.h"

using namespace std;
namespace Ui {
class FloodForm;
}

class TestForm : public QWidget
{
    Q_OBJECT

public:
    explicit TestForm(QWidget *parent = 0);
    ~TestForm();

private:
    Ui::TestForm *ui;
private slots:
    void on_pushButton_3_clicked();
signals:
    void getString(QString msg);//不需要实现
};

#endif // FLOODFORM_H

子窗体的cpp文件

#include "testform.h"
#include "ui_floodform.h"

FloodForm::TestForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TestForm)
{
    ui->setupUi(this);

    pushButton = ui->pushButton_3;
}

TestForm::~TestForm()
{
    delete ui;
}


//===按钮事件,开始计算
void TestForm::on_pushButton_3_clicked()
{
    emit getString("信息传递成功!");
    this->close();  //关闭当前窗体
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值