先简单概述一下窗口之间传递参数的机制–“张三去商店买烟”
分解动作:
谁?–张三
去哪?–商店
要干嘛?–买烟
怎么去?–走路去
结果?–张三得到烟
窗口(A):张三
信号(signal):想要买烟
连接方式(connect):走路去
结果(void):张三得到烟
窗口(B):商店
槽函数(slots):商店给张三烟
能看完的才能学到点东西。
如上所述:QT采用信号与槽函数实现不同窗口之间的参数传递,下面上代码示例:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "dialog.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
void sendData(QString);//发送数据的信号,不需要实体函数,在头文件定义就可以
private slots:
void on_pushButton_clicked();
void getData(QString);//得到数据的槽函数
private:
Ui::MainWindow *ui;
Dialog *_interface = new Dialog();//初始化dialog窗口,实例化对象,可以在mainwindow中调用dialog的函数
};
#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);
//这里才是连接信号和槽函数的重点
connect(this,SIGNAL(sendData(QString)),_interface,SLOT(getData(QString)));
connect(_interface,SIGNAL(sendData(QString)),this,SLOT(getData(QString)));
}
MainWindow::~MainWindow()
{
delete ui;
}
//点击按钮时,得到文本框的值并发送数据
void MainWindow::on_pushButton_clicked()
{
QString strss = ui->lineEdit->text();
emit sendData(strss);//发送数据,使用emit
//显示第二个窗口
_interface->show();
}
//得到数据的槽函数
void MainWindow::getData(QString str2)
{
ui->lineEdit_2->setText(str2);
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
signals:
void sendData(QString);//发送数据的信号
private slots:
void on_pushButton_clicked();
void getData(QString);//得到数据的槽函数
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_pushButton_clicked()
{
QString str2 = ui->lineEdit_senddata->text();
emit sendData(str2);
}
void Dialog::getData(QString str1)
{
ui->lineEdit_getdata->setText(str1);
}
以上代码可以实现两个窗口之间相互传递参数。最主要的就是各个窗口把自己想要什么和自己能分享什么都列出来了,怎么连接他们尼?就是靠connect(),
connect(窗口A,窗口A的信号,窗口B,窗口B的槽函数)
分析下面这句话:
connect(this,SIGNAL(sendData(QString)),_interface,SLOT(getData(QString)));
连接这个窗口和_interface窗口,从这个窗口的sendData发送数据,_interface窗口的getData接收数据,信号和槽都是函数,只不过信号函数只需要在头文件里定义,不需要在源文件中实现函数体,而槽函数在头文件中定义之后还需要在原文件中实现函数的定义。