信号与槽是用于两个对象间的通信。QT中N-N的方式是不同于其他开发框架的最突出特征。也就是说可以实现一对一,一对多,多对多的通信。本文描述的是1对1通信模式的结构和实例。
比如:一个小对话框上输入一个数字,点击按钮后数字传到主对话框上。
1.信号的定义与实现
2.槽定的定义与实现
3.信号与槽的关联(自动、手动)
4.实例代码
为了描述方便 :主对话框命名为 Mainwindow 对应的文件名为Mainwindow.cpp和Mainwindow.h
小对话框命名为 myDlg 对应的文件名为myDlg .cpp和myDlg .h
传递的数值为 myDlg 上mySpinBox 框内的数字
接收显示的地方为 Mainwindow上 myLabel
触发为 myDlg 上 pushButton按钮的clicked()
1.信号的定义与实现
信号的关键词 :signal emit
signals: void dlgReturn(int); // 自定义对话框
emit dlgReturn(value); //发射信号
此处小对话框中的数字为需传递的数值,所以得在myDlg定义并发射信号
myDlg.h signals: void dlgReturn(int); //定义信号
myDlg.cpp emit dlgReturn(value); //发射信号 此处value值取自于输入对话框
2.槽定的定义与实现
槽的关键词:slots
private slots:
void on_pushButton_clicked() //自动关联的槽函数
on_控件名_事件名 格式命名函数,它自动关联事件和控件,无需再写connect函数,也无需写实现函数。
void showValue(int value); //自定义传递数值的槽函数
在主对话框中显示数值, 所以在Mainwindow.cpp
void MainWindow::showValue(int value) // 自定义槽函数
{
ui->myLabel->setText(tr("获取的值是:%1").arg(value));
}
3.信号与槽的关联(自动、手动)
定义:connect( const QObject *sender,(发送的控件)
const char *signal, (信号函数)
const QObject *receiver,(接收的控件)
const char *method,(接收的方式)
Qt::ConnectionType type =Qt::AutoConnection);
4.实例代码
4.1 main .cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
4.2小对话框 myDlg.h myDlg.cpp
#ifndef MYDLG_H
#define MYDLG_H
#include <QDialog>
namespace Ui {
class myDlg;
}
class myDlg : public QDialog
{
Q_OBJECT
public:
explicit myDlg(QWidget *parent = nullptr);
~myDlg();
private:
Ui::myDlg *ui;
signals:
void dlgReturn(int); // 自定义的信号
private slots:
void on_pushButton_clicked();
};
#endif // MYDLG_H
#include "mydlg.h"
#include "ui_mydlg.h"
myDlg::myDlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::myDlg)
{
ui->setupUi(this);
}
myDlg::~myDlg()
{
delete ui;
}
void myDlg::on_pushButton_clicked()
{
int value = ui->mySpinBox->value(); // 获取输入的数值
emit dlgReturn(value); // 发射信号
close(); // 关闭对话框
}
4.3主对话框 MainWindow.h MainWindow.cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mydlg.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void showValue(int value);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mydlg.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
myDlg *dlg = new myDlg(this);
connect(dlg, &myDlg::dlgReturn,this,&MainWindow::showValue);
dlg->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::showValue(int value) // 自定义槽
{
ui->myLabel->setText(tr("获取的值是:%1").arg(value));
}