Qt5开发实例之自定义信号与槽以及多窗口
程序员文章站
2022-05-28 11:35:13
...
mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
// 包含子窗口头文件
#include "subwidget.h";
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
// 自定义槽函数
void mySlot();
void changeWin();
void dealSub();
private:
QPushButton b1;
QPushButton *b2;
QPushButton b3;
SubWidget w;
};
#endif // MAINWIDGET_H
main.cpp
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w;
w.show();
return a.exec();
}
mainwidget.cpp
#include "mainwidget.h"
#include <QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this);
b1.setText("b1");
b1.move(100,100);
b2 = new QPushButton(this);
b2->setText("b2");
// &b1 信号发出者,指针类型
// &QPushButton::pressed 处理的信号 &发送者的类名::信号名称
// &QPushButton::close 信号处理函数 &接收的类名::槽函数
connect(&b1,&QPushButton::pressed,this,&QPushButton::close);
connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
// 自定义槽函数
// 槽函数需要与信号一致(参数,返回值)
// 由于信号没有返回值,所以槽函数一定没有返回值
connect(b2,&QPushButton::released,this,&MainWidget::mySlot);
setWindowTitle("老大");
//等价于$this->setWindowTitle("老大")
b3.setParent(this);
b3.setText("切换到子窗口");
b3.move(50,50);
// 显示子窗口
//w.show();
// 自定义槽函数
connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);
// 处理子窗口信号
connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub);
resize(400,300);
}
// 自定义槽函数
void MainWidget::mySlot()
{
b2->setText("123");
}
void MainWidget::changeWin()
{
// 子窗口显示
w.show();
// 主窗口隐藏
this->hide();
}
void MainWidget::dealSub()
{
// 子窗口隐藏
w.hide();
// 主窗口显示
show();
}
MainWidget::~MainWidget()
{
}
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
// 自定义槽函数
void sendSlot();
public:
explicit SubWidget(QWidget *parent = 0);
signals:
// 自定义信号,信号只需声明,无需定义
void mySignal();
public slots:
private:
QPushButton b;
};
#endif // SUBWIDGET_H
subwidget.cpp
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
setWindowTitle("小弟");
b.setParent(this);
b.setText("切换到主窗口");
connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);
resize(400,300);
}
void SubWidget::sendSlot()
{
// 发射信号
emit mySignal();
}
运行效果如下:
推荐阅读