本节在Qt信号与槽之标准信号的基础上继续实验,目的在于掌握自定义信号的使用
实验任务如下:
实验步骤如下:
新建子窗口SubWidget类
在mainwidget.h中为MainWidget类添加私有成员b3和subWin
#include "subwidget.h"
//...(略)
private:
QPushButton b1;
QPushButton b2;
QPushButton b3; //窗口切换按钮
SubWidget subWin; //子窗口
实现从主窗口切换到子窗口的功能
//按钮b3
b3.setParent(this);
b3.setText("切换到子窗口");
b3.move(100, 0);
connect(&b3, &QPushButton::pressed, this, &MainWidget::showSub); //显示子窗口
public:
void showSub();
void MainWidget::showSub()
{
hide();
subWin.show();
}
实现从子窗口切换到主窗口的功能(涉及自定义信号)
#include <QPushButton>
//...(略)
public:
void sendSignal();
private:
QPushButton b;
signals:
void mySignal();
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
//子窗口
resize(400, 200);
setWindowTitle("小弟");
//按钮b
b.setParent(this);
b.setText("切换到主窗口");
connect(&b, &QPushButton::pressed, this, &SubWidget::sendSignal);
}
void SubWidget::sendSignal()
{
emit mySignal();
}
connect(&subWin, &SubWidget::mySignal, this, &MainWidget::showMain); //显示主窗口
void MainWidget::showMain()
{
show();
subWin.hide();
}
编译运行,测试实验效果
总结:
完整代码附录:
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 changeText();
void showSub();
void showMain();
private:
QPushButton b1;
QPushButton b2;
QPushButton b3;
SubWidget subWin;
};
#endif // MAINWIDGET_H
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr);
void sendSignal();
private:
QPushButton b;
signals:
void mySignal();
public slots:
};
#endif // SUBWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
//窗口
resize(600, 400);
setWindowTitle("老大");
//按钮b1
b1.setParent(this);
b1.setText("abc");
//按钮b2
b2.setParent(this);
b2.setText("close");
b2.move(200, 200);
//按钮b3
b3.setParent(this);
b3.setText("切换到子窗口");
b3.move(100, 0);
//信号与槽:Qt对象之间通信的接口
//信号与槽如同短信和手机:一个信号可以被多个槽接收
//信号发出者、处理的信号、信号接收者、槽函数(信号处理函数)
connect(&b1, &QPushButton::pressed, this, &MainWidget::changeText);
connect(&b2, &QPushButton::released, this, &MainWidget::close);
//窗口切换
connect(&b3, &QPushButton::pressed, this, &MainWidget::showSub); //显示子窗口
connect(&subWin, &SubWidget::mySignal, this, &MainWidget::showMain); //显示主窗口
}
MainWidget::~MainWidget()
{
}
//可以像定义普通函数一样自定义槽函数
//在Qt5中,槽可以为任意的成员函数,普通全局函数,静态函数
//槽函数需要与信号一致(参数,返回值),因为信号都没有返回值,所以槽函数一定没有返回值
void MainWidget::changeText()
{
b1.setText("123");
}
void MainWidget::showSub()
{
hide();
subWin.show();
}
void MainWidget::showMain()
{
show();
subWin.hide();
}
subwidget.cpp
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
//子窗口
resize(400, 200);
setWindowTitle("小弟");
//按钮b
b.setParent(this);
b.setText("切换到主窗口");
connect(&b, &QPushButton::pressed, this, &SubWidget::sendSignal);
}
void SubWidget::sendSignal()
{
emit mySignal();
}
main.cpp
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w; //执行MainWidget的构造函数
w.show();
return a.exec();
}
原文:https://www.cnblogs.com/henx/p/14280320.html