在开发当中,经常会遇到在A界面需要的数据,而这部分数据却处于B界面当中,以下有一种通过信号与槽的方法可以将数据传输到需要处理的界面当中。
目前有两个界面,界面A为mainwindow,界面B为form,下方的功能,是将B界面当中输入的文本,展示到A界面当中,以下为界面布局和文件名。
界面A当中只有一个Label,界面B当中有个Button和LineEdit
界面A:
界面B:
首先在界面B当中添加一个信号:
signals:
void set1(QString txt);
之后转到界面B的cpp文件,在构造函数当中连接信号:
Form::Form(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Form)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
emit set1(ui->lineEdit->text());
});
//lambda写法
}
于界面A的头文件,添加一个槽用于处理接收到的信号:
public slots:
void get1(QString txt);
回到界面A的cpp文件,在构造函数当中处理接收到的信号:
void MainWindow::get1(QString txt)
{
ui->label->setText(txt);
}
在界面A的构造函数当中,将界面B的信号与界面A的槽函数做连接:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&form,SIGNAL(set1(QString)),this,SLOT(get1(QString)));
form.show();
}
此时,在界面B当中输入的文字,可以正确的在界面A当中做显示,效果如下
完整代码:
Form.h:
#ifndef FORM_H
#define FORM_H
#include <QWidget>
#include <QString>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = nullptr);
~Form();
signals:
void set1(QString txt);
private:
Ui::Form *ui;
};
#endif // FORM_H
Form.cpp:
#include "form.h"
#include "ui_form.h"
Form::Form(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Form)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
emit set1(ui->lineEdit->text());
});
}
Form::~Form()
{
delete ui;
}
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "form.h"
#include<QObject>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void get1(QString txt);
private:
Ui::MainWindow *ui;
Form form;
};
#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(&form,SIGNAL(set1(QString)),this,SLOT(get1(QString)));
form.show();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::get1(QString txt)
{
ui->label->setText(txt);
}