概述
信号槽用于对象间的通讯,是观察者模式的一种实现。
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();
//关闭当前窗体
}
最后
以上就是美丽蛋挞为你收集整理的Qt中信号/槽机制的全部内容,希望文章能够帮你解决Qt中信号/槽机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复