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)知识点总结
效果演示