qt入门(8):信号与槽机制connect,两个窗口之间的通信 您所在的位置:网站首页 oppo官网价格 qt入门(8):信号与槽机制connect,两个窗口之间的通信

qt入门(8):信号与槽机制connect,两个窗口之间的通信

2024-06-07 19:20| 来源: 网络整理| 查看: 265

目录

1 基本思路 2 代码

基本思路

要实现两个完全不同的窗口之间的通信,使用信号和槽的功能。首先添加类别中选择“QT”,然后可以添加一个ui类,这样就可以添加第二个窗口,并且使用UI进行设计。

然后关键就是实现两个窗口之间的通信,首先是发出信号。很简单,在类中使用signals:的前缀声明,然后分别添加void信号,根据需求可以使用有参数的信号和没有参数的信号。下面是两个.h文件中的信号

signals: void SignalInForm2_HideMainWindow(); signals: void SignalInMainWindow_HideForm2();

接下来就是发送信号了,通过对按钮建立槽函数,选择click,然后在槽函数中写一个emit signal();即可,具体可见槽函数如下

void Form2::on_button_hide_clicked() { emit SignalInForm2_HideMainWindow(); } void MainWindow::on_button_hide_clicked() { emit SignalInMainWindow_HideForm2(); }

关键在于如何建立对象和信号之间的链接,注意,connect并不是一定要在构造函数中创建的,也可以在后面再调用函数进行链接。这里我自己写了一个接口,用来链接两个类。如下

void Form2::MakeConnection(void *_m) { MainWindow* ptr=(MainWindow*)_m; connect(ptr,&MainWindow::SignalInMainWindow_HideForm2,this,&Form2::hide); } void MainWindow::MakeConnection(Form2* _f) { connect(_f,&Form2::SignalInForm2_HideMainWindow,this,&MainWindow::hide); }

然后在主程序中调用这两个接口进行链接,这样就建立了两个完全独立的窗口的链接。

#include "mainwindow.h" #include "form2.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); Form2 f; f.show(); w.MakeConnection(&f); f.MakeConnection(&w); return a.exec(); }

注意到在上面的接口中,我一个使用的是对应的类的指针,另外一个使用的是void*指针,然后将它转换为对应类的指针。一方面这是一种用法,另外一方面我一开始是报错的,不知道是不是因为我这样修改之后就不再报错了,原因不明.

查找原因后发现,其实就是头文件里面不要互相包含,比如a.h里面include了b.h,那么b.h里面最好就不要再include了a.h了,否则似乎会产生相互包含,产生没有声明的缺陷。

代码

链接:https://pan.baidu.com/s/1LCYU1d_CFzcrKHF-XPVGfg 提取码:59iu

SignalAndSlot.pro #------------------------------------------------- # # Project created by QtCreator 2019-12-22T16:25:06 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = SignalAndSlot TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ mainwindow.cpp \ form2.cpp HEADERS += \ mainwindow.h \ form2.h FORMS += \ mainwindow.ui \ form2.ui form2.h #ifndef FORM2_H #define FORM2_H #include #include"mainwindow.h" namespace Ui { class Form2; } class Form2 : public QWidget { Q_OBJECT public: explicit Form2(QWidget *parent = 0); ~Form2(); void MakeConnection(void *_m); private: Ui::Form2 *ui; signals: void SignalInForm2_HideMainWindow(); private slots: void on_button_hide_clicked(); }; #endif // FORM2_H mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "form2.h" #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void MakeConnection(Form2* _f); private: Ui::MainWindow *ui; signals: void SignalInMainWindow_HideForm2(); private slots: void on_button_hide_clicked(); }; #endif // MAINWINDOW_H form2.cpp #include "form2.h" #include "ui_form2.h" #include "mainwindow.h" Form2::Form2(QWidget *parent) : QWidget(parent), ui(new Ui::Form2) { ui->setupUi(this); } Form2::~Form2() { delete ui; } void Form2::on_button_hide_clicked() { emit SignalInForm2_HideMainWindow(); } void Form2::MakeConnection(void *_m) { MainWindow* ptr=(MainWindow*)_m; connect(ptr,&MainWindow::SignalInMainWindow_HideForm2,this,&Form2::hide); } main.cpp #include "mainwindow.h" #include "form2.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); Form2 f; f.show(); w.MakeConnection(&f); f.MakeConnection(&w); return a.exec(); } mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "form2.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_button_hide_clicked() { emit SignalInMainWindow_HideForm2(); } void MainWindow::MakeConnection(Form2* _f) { connect(_f,&Form2::SignalInForm2_HideMainWindow,this,&MainWindow::hide); } 代码架构

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有