Qt基础-信号和槽函数

参考Qt学习笔记(二):信号和槽

使用自定义带参和无参信号和槽函数实现子窗口和主窗口的切换

childwidget是子窗口实现逻辑,mywidget是主窗口实现逻辑。

childwidget.h

#ifndef CHILDWIDGET_H
#define CHILDWIDGET_H
#include <qwidget.h>
#include <QPushButton>
#include <QString>
class ChildWidget :
    public QWidget
{
    Q_OBJECT
public:
    explicit ChildWidget(QWidget *parent=0);
signals:
    // 自定义信号(有参无参)
    void mySignal();
    void mySignal(int,QString);
public slots:
    // 自定义处理btn请求的槽函数
    void sendSignal();
private:
    QPushButton btn;
};
#endif

childwidget.cpp

#include "childwidget.h"

ChildWidget::ChildWidget(QWidget *parent):QWidget(parent){
	// 子窗口大小调整
	this->resize(400,300);
	// 子窗口标题
	this->setWindowTitle("child window");
	// 设置btn的父窗口
	btn.setParent(this);
	// 按钮显示样例
	btn.setText("to main window");
	// 移动btn到(200,100)
	btn.move(200,100);
	// 链接信号和槽函数
	connect(&btn,&QPushButton::clicked,this,&ChildWidget::sendSignal);

}
void ChildWidget::sendSignal() {
	// 发送信号 emit是发送信号关键字
	emit mySignal();
	emit mySignal(110, "I am a child window");

}

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "childwidget.h"
#include <QString>
#include <QDebug>
#include <iostream>
//using namespace std;
class MyWidget :public QWidget {
	Q_OBJECT
public:
	MyWidget(QWidget* parent = 0);
	~MyWidget();
	void mySlot();
	void dealSignal();
	void dealSignal(int,QString);
private:
	QPushButton b1;
	QPushButton* b2;
	// 将子窗口对象声明
	ChildWidget child;
};
#endif 

mywidget.cpp

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent):QWidget(parent) {
	this->resize(400, 300);
	this->setWindowTitle("main window");
	b1.setParent(this);
	b1.setText("to child window");
	b1.move(200, 100);
	// 使用函数指针指向重载函数,避免二义性
	void (ChildWidget::*noParamSignal)(void) = &ChildWidget::mySignal;
	void (MyWidget:: * noParamSlot)(void) = &MyWidget::dealSignal;
	void (ChildWidget:: * haveParamSignal)(int, QString) = &ChildWidget::mySignal;
	void (MyWidget:: * haveParamSlot)(int, QString) = &MyWidget::dealSignal;
	connect(&b1,&QPushButton::clicked,this,&MyWidget::mySlot);
	// 子窗口和主窗口互相切换
	connect(&child, noParamSignal, this, noParamSlot);
	connect(&child, haveParamSignal, this, haveParamSlot);
	
	
}
MyWidget::~MyWidget() {

}
void MyWidget::mySlot() {
	this->hide();
	child.show();
}
void MyWidget::dealSignal() {
	this->show();
	child.hide();
}
void MyWidget::dealSignal(int a,QString str) {
	qDebug() << "a=" << a << " str=" << str;
}

main.cpp

#include "QtWidgetsApplication1.h"
#include <QtWidgets/QApplication>
#include "mywidget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtWidgetsApplication1 w;
    MyWidget h;
    h.show();
    //w.show();
    return a.exec();
}

信号、槽和链接函数(connect)知识点总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

效果演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值