千家信息网

Qt如何实现两个独立窗口的信号通信

发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,小编给大家分享一下Qt如何实现两个独立窗口的信号通信,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下知识点Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、La
千家信息网最后更新 2025年11月16日Qt如何实现两个独立窗口的信号通信

小编给大家分享一下Qt如何实现两个独立窗口的信号通信,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

具体内容如下

知识点

Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、Lamber表达式、自定义信号和自定义槽函数

结果演示

main.cpp

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

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include #include "subwidget.h"class MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = 0);    ~MainWindow();public slots:    void changeWin();    void ShutDown();    void delSub();    void delSubPrint(int,QString);private:    QPushButton *p1;    QPushButton *shutdown;//关闭按钮    SubWidget subW;};#endif // MAINWINDOW_H

subwidget.h

#ifndef SUBWIDGET_H#define SUBWIDGET_H#include #include class SubWidget : public QWidget{    Q_OBJECTpublic:    explicit SubWidget(QWidget *parent = 0);    void sendSlot();signals:    /* 信号必须有signals关键字来声明          * 信号没有返回值,但可以有参数          * 信号就是函数的声明,只需声明,无需定义          * 使用:emit mySignal();          * 信号可以重载      */    void mySignal();    void mySignal(int,QString);public slots:private:    QPushButton *subP1;//子窗口按钮};#endif // SUBWIDGET_H

mainwindow.cpp

#include "mainwindow.h"#include  //打印MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    resize(400,300);    this->setWindowTitle("BOSS");    p1=new QPushButton(this);    //p1->setParent(this);    p1->setText("切换到子窗口");    shutdown=new QPushButton(this);    shutdown->setText("关闭");    shutdown->move(100,0);    //关闭所有窗口    connect(shutdown,&QPushButton::released,this,&MainWindow::ShutDown);    //主窗口隐藏,子窗口显示    connect(p1,&QPushButton::released,this,&MainWindow::changeWin);    /* &p1: 信号发出者,指针类型        * &QPushButton::pressed:处理的信号,  &发送者的类名::信号名字        * this: 信号接收者        * &MainWidget::close: 槽函数,信号处理函数  &接收的类名::槽函数名字       */       /* 自定义槽,普通函数的用法        * Qt5:任意的成员函数,普通全局函数,静态函数        * 槽函数需要和信号一致(参数,返回值)        * 由于信号都是没有返回值,所以,槽函数一定没有返回值        */    //主窗口调用子窗口的信号    //主窗口显示,子窗口隐藏    //connect(&subW,&SubWidget::mySignal,this,&MainWindow::delSub);//函数重载用不了    //信号的重载 一个有参数 一个无参数    //接收子窗口的信号方式一//    void (SubWidget::*SignalOnly)()=&SubWidget::mySignal;//    connect(&subW,SignalOnly,this,&MainWindow::delSub);//    void (SubWidget::*SignalCanShu)(int,QString)=&SubWidget::mySignal;//    connect(&subW,SignalCanShu,this,&MainWindow::delSubPrint);    //接收子窗口的信号方式二:宏函数SIGNAL    connect(&subW,SIGNAL(mySignal()),this,SLOT(delSub()));    connect(&subW,SIGNAL(mySignal(int,QString)),this,SLOT(delSubPrint(int,QString)));    //Lambda表达式, 匿名函数对象    //C++11增加的新特性, 项目文件: CONFIG += C++11    //Qt配合信号一起使用,非常方便    QPushButton *LamPush=new QPushButton(this);    LamPush->setText("Lamber表达式");    LamPush->move(180,0);    int a=10;    connect(LamPush,&QPushButton::clicked,            [=](){                    qDebug()<hide();    subW.show();}//关闭窗口void MainWindow::ShutDown(){    this->close();    subW.close();}void MainWindow::delSub(){    subW.hide();    this->show();}void MainWindow::delSubPrint(int age,QString name){    // str.toUtf8() -> 字节数组QByteArray     // ……data()  -> QByteArray -> char *    qDebug() << age << name.toUtf8().data();}MainWindow::~MainWindow(){}

subwidget.cpp

#include "subwidget.h"SubWidget::SubWidget(QWidget *parent) :    QWidget(parent){    this->setWindowTitle("SUB");    subP1=new QPushButton(this);    subP1->setText("切换到主窗口");    resize(500,400);    //子窗口发送信号 信号是有参数+无参数的    connect(subP1,&QPushButton::clicked,this,&SubWidget::sendSlot);}//回调函数void SubWidget::sendSlot(){    emit mySignal();    emit mySignal(26,"唐维康");}

看完了这篇文章,相信你对"Qt如何实现两个独立窗口的信号通信"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

0