- 采用qt的信号与槽机制进行两个界面之间的互相通信
- 主界面想要连接子界面,首先必须初始化子界面,注意connect最好跟在初始化之后,类似于指针的使用(指针在使用前必须初始化,否则会报错)
- 不要两个类互相调用声明,会陷入无限构造的死循环,认清主次
1 UI布局
1.1 主界面UI
- QLineEdit
lineEdit_send用于输入向子界面发送的信息 - QLineEdit
lineEdit_rec用于接收向子界面发送的信息 - QPushButton
pushButton点击clicked,向子界面发送信号

1.2子界面UI
- QLabel
label接收主界面信息 - QPushButton
pushButton点击clicked,向子界面发送信号

2 头文件
2.1 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "SubDialog.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void recSub(QString str);//槽函数,接收子界面的信号
signals:
void sendSub(QString str);//发送给子界面的信号
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
2.2 SubDialog.h
#ifndef SUBDIALOG_H
#define SUBDIALOG_H
#include <QDialog>
#include <QDateTime>
namespace Ui {
class SubDialog;
}
class SubDialog : public QDialog
{
Q_OBJECT
public:
explicit SubDialog(QWidget *parent = nullptr);
~SubDialog();
void recMain(QString str);//槽函数,接收主界面信号
signals:
void sendMain(QString str);//发送给主界面的信号
private slots:
void on_pushButton_clicked();
private:
Ui::SubDialog *ui;
};
#endif // SUBDIALOG_H
3 源文件
3.1 mainwindow.cpp
#include <QDesktopWidget>
#include <QApplication>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDesktopWidget *deskdop=QApplication::desktop();
move((deskdop->width()-this->width())/2, (deskdop->height()-this->height())/2);//使界面生成在屏幕中央
SubDialog *sub=new SubDialog(this);//必须先确定生成的界面,再连接子界面槽函数,或者接收子界面信号
sub->show();//生成子界面,parent为主界面,永远在主界面上方
//子界面生成以后再进行连接,同时注意两次connect函数的不同
connect(this,&MainWindow::sendSub,sub,&SubDialog::recMain);//向子界面发送信号
connect(sub,&SubDialog::sendMain,this,&MainWindow::recSub);//接收子界面信号
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::recSub(QString str)
{
ui->lineEdit_rec->setText(str);
}
void MainWindow::on_pushButton_clicked()
{
emit sendSub(ui->lineEdit_send->text());//向子界面发送信号
}
3.2 SubDialog.cpp
#include "SubDialog.h"
#include "ui_SubDialog.h"
SubDialog::SubDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SubDialog)
{
ui->setupUi(this);
}
SubDialog::~SubDialog()
{
delete ui;
}
void SubDialog::recMain(QString str)
{
ui->label->setText(str);
}
void SubDialog::on_pushButton_clicked()
{
emit sendMain(QDateTime::currentDateTime().toString());//向主界面发送信号
}
3.3 main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
运行截图

- Qt练习时长两年半,接qt,C++兼职,课设,指导等;
- VX:QAQ2333oooo
- QQ:1580947517