本文实例为大家分享了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> int main( int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.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" class MainWindow : public QMainWindow { Q_OBJECT public : 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
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> class SubWidget : public QWidget { Q_OBJECT public : 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
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= 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()<<a; } ); } void MainWindow::changeWin(){ this ->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
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= new QPushButton( this ); subP1->setText( "切换到主窗口" ); resize(500,400); //子窗口发送信号 信号是有参数+无参数的 connect(subP1,&QPushButton::clicked, this ,&SubWidget::sendSlot); } //回调函数 void SubWidget::sendSlot(){ emit mySignal(); emit mySignal(26, "唐维康" ); } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/taw19960426/article/details/121939735