这篇文章主要为大家详细介绍了Qt实现两个独立窗口的信号通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Qt实现两个独立窗口的信号通信的具体代码,供大家参考,具体内容如下
知识点
Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、Lamber表达式、自定义信号和自定义槽函数
结果演示

main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include "mainwindow.h"#include "subwidget.h"#include <QApplication>intmain(intargc, char*argv[]){ QApplication a(argc, argv); MainWindow w; w.show(); returna.exec();} |
mainwindow.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QPushButton>#include "subwidget.h"classMainWindow : publicQMainWindow{ Q_OBJECTpublic: MainWindow(QWidget *parent = 0); ~MainWindow();publicslots: voidchangeWin(); voidShutDown(); voiddelSub(); voiddelSubPrint(int,QString);private: QPushButton *p1; QPushButton *shutdown;//关闭按钮 SubWidget subW;};#endif // MAINWINDOW_H |
subwidget.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #ifndef SUBWIDGET_H#define SUBWIDGET_H#include <QWidget>#include <QPushButton.h>classSubWidget : publicQWidget{ Q_OBJECTpublic: explicitSubWidget(QWidget *parent = 0); voidsendSlot();signals: /* 信号必须有signals关键字来声明 * 信号没有返回值,但可以有参数 * 信号就是函数的声明,只需声明,无需定义 * 使用:emit mySignal(); * 信号可以重载 */ voidmySignal(); voidmySignal(int,QString);publicslots:private: QPushButton *subP1;//子窗口按钮};#endif // SUBWIDGET_H |
mainwindow.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include "mainwindow.h"#include <QDebug> //打印MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ resize(400,300); this->setWindowTitle("BOSS"); p1=newQPushButton(this); //p1->setParent(this); p1->setText("切换到子窗口"); shutdown=newQPushButton(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=newQPushButton(this); LamPush->setText("Lamber表达式"); LamPush->move(180,0); inta=10; connect(LamPush,&QPushButton::clicked, [=](){ qDebug()<<a; } );}voidMainWindow::changeWin(){ this->hide(); subW.show();}//关闭窗口voidMainWindow::ShutDown(){ this->close(); subW.close();}voidMainWindow::delSub(){ subW.hide(); this->show();}voidMainWindow::delSubPrint(intage,QString name){ // str.toUtf8() -> 字节数组QByteArray // ……data() -> QByteArray -> char * qDebug() << age << name.toUtf8().data();}MainWindow::~MainWindow(){} |
subwidget.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include "subwidget.h"SubWidget::SubWidget(QWidget *parent) : QWidget(parent){ this->setWindowTitle("SUB"); subP1=newQPushButton(this); subP1->setText("切换到主窗口"); resize(500,400); //子窗口发送信号 信号是有参数+无参数的 connect(subP1,&QPushButton::clicked,this,&SubWidget::sendSlot);}//回调函数voidSubWidget::sendSlot(){ emit mySignal(); emit mySignal(26,"唐维康");} |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...










