//主窗口头文件
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "subwidget.h"
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);
~MainWidget();
//public slots:
void changeWin();
void dealSub();
void dealSlot(int ,QString);
private:
QPushButton mb;
SubWidget sw;
};
#endif // MAINWIDGET_H
//主窗口源文件
#include "mainwidget.h"
#include<QPushButton>
#include<QDebug> //打印
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle(QStringLiteral("我是老板主窗口"));
mb.setParent(this);
mb.setText("ToSub");
mb.move(50,50);
//显示子窗口
//subw.show();
connect(&mb,&QPushButton::released,this,&MainWidget::changeWin);
//处理子窗口的信号
//信号具有广播的性质,子窗口发送信号,主窗口捕获之后作dealSub的处理
void (SubWidget:: *pNoPara)()=&SubWidget::mySignal;
connect(&sw,pNoPara,this,&MainWidget::dealSub);
void (SubWidget:: *pHavePara)(int , QString)=&SubWidget::mySignal;
connect(&sw,pHavePara,this,&MainWidget::dealSlot);
resize(500,500);
// //Qt4信号连接 不建议使用 容易出错,因为把函数名转化成字符串,不进行错误检查
// //Qt4槽函数必须有slots关键字来修饰
// connect(&sw,SIGNAL(mySignal()),this,SLOT(dealSub()));
// connect(&sw,SIGNAL(mySignal(int,QString)),this,SLOT(dealSlot(int,QString)));
}
void MainWidget::changeWin()
{
sw.show();
this->hide();
}
void MainWidget::dealSub()
{
sw.hide();
this->show();
}
void MainWidget::dealSlot(int a, QString str)
{
qDebug()<<a<<" "<<str; //打印
}
MainWidget::~MainWidget()
{
}
//子窗口头文件
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include<QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr);
void sendSlot();
signals:
/*
* 信号必须有signals关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit mySignal();
* 信号可以重载
*/
void mySignal();
void mySignal(int, QString);
private:
QPushButton sb;
};
#endif // SUBWIDGET_H
//子窗口源文件
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle(QStringLiteral("我是公司的好员工"));
sb.setParent(this);
sb.setText("ToBOSS");
sb.move(50,50);
connect(&sb,&QPushButton::clicked,this,&SubWidget::sendSlot);//点击子窗口按钮就会发送我们自定义的信号
resize(500,500);
}
void SubWidget::sendSlot() //函数的功能就是发送我们自定义的信号
{
emit mySignal(); //子窗口自定义信号
emit mySignal(250,QStringLiteral("我是子窗口"));
}
Qt--带参数的信号
最新推荐文章于 2024-07-11 19:08:42 发布