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)知识点总结

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

效果演示

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

猜你喜欢

转载自blog.csdn.net/qq_35140742/article/details/122750544