Qt实现两个独立窗口的信号通信
短信预约 -IT技能 免费直播动态提醒
本文实例为大家分享了Qt实现两个独立窗口的信号通信的具体代码,供大家参考,具体内容如下
知识点
Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、Lamber表达式、自定义信号和自定义槽函数
结果演示
main.cpp
#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
#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
#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:
void mySignal();
void mySignal(int,QString);
public slots:
private:
QPushButton *subP1;//子窗口按钮
};
#endif // SUBWIDGET_H
mainwindow.cpp
#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);
//主窗口调用子窗口的信号
//主窗口显示,子窗口隐藏
//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
#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,"唐维康");
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341