mainWidget.h
#ifndef MAINWIDGET_H#define MAINWIDGET_H#include#include #include "subwidget.h"class mainWidget : public QWidget{ Q_OBJECTpublic: mainWidget(QWidget *parent = 0); ~mainWidget(); //Qt4信号连接 //QT4槽函数必须有slots关键字来修饰//public slots: //槽没有返回值,因为槽和信号是对应的,信号没有返回值 void mySlot(); void changeWin(); void dealSub(); void dealSlot(int,QString);private: QPushButton b1; QPushButton *b2; QPushButton b3; subWidget subw;};#endif // MAINWIDGET_H
subWidget.h
#ifndef SUBWIDGET_H#define SUBWIDGET_H#include#include class subWidget : public QWidget{ Q_OBJECTpublic: explicit subWidget(QWidget *parent = nullptr); void sendSlot();signals: /* 信号必须有signals关键字来声明 * 信号没有返回值,但可以有参数 * 信号就是函数的声明,只需声明,无需定义 * 使用:emit mySignal(); * 信号可以重载 */ void mySignal(); void mySignal(int,QString);public slots:private: QPushButton b;};#endif // SUBWIDGET_H
main.cpp
/*信号与槽:QT对象之间通信的接口 */#include "mainwidget.h"#includeint main(int argc, char *argv[]){ QApplication a(argc, argv); mainWidget w;//执行mainwidget的构造函数 w.show(); return a.exec();}
mainWidget.cpp
#include "mainwidget.h"#include//打印mainWidget::mainWidget(QWidget *parent) : QWidget(parent){ b1.setParent(this); b1.setText("close"); b1.move(100,100); b2 = new QPushButton(this); b2->setText("hide"); connect(&b1,&QPushButton::pressed,this,&mainWidget::close); /* &b1:信号发出者,指针类型 * &QPushButton::pressed:处理的信号, &发送者的类名::信号的名字 * this:信号接收者 * &mainWidget::close : 槽函数,信号处理函数 &接收者的类名::槽函数的名字 */ /* 自定义槽,普通函数的用法 * Qt5:任意的成员函数,普通全局函数,静态函数 * 槽函数需要和信号一直(参数,返回值) * 由于信号都是没有返回值,所以,槽函数一定没有返回值 */ connect(b2,&QPushButton::released,this,&mainWidget::mySlot); connect(b2,&QPushButton::released,&b1,&QPushButton::hide); /* 信号:短信 * 槽函数:接收短信的手机 */ setWindowTitle("老大");//等价于this->setWindowTitle("老大"); b3.setParent(this); b3.setText("切换到子窗口"); b3.move(50,50); //显示子窗口 //w.show(); connect(&b3,&QPushButton::released,this,&mainWidget::changeWin); //处理子窗口的信号 //Qt5信号连接 void (subWidget::*funSignal)() = &subWidget::mySignal; connect(&subw,funSignal,this,&mainWidget::dealSub); void (subWidget::*testSignal)(int,QString) = &subWidget::mySignal; connect(&subw,testSignal,this,&mainWidget::dealSlot); //Qt4信号连接 //QT4槽函数必须有slots关键字来修饰 //connect(&subw, SIGNAL(mySignal()),this,SLOT(dealSub())); //connect(&subw, SIGNAL(mySignal(int QString)),this,SLOT(dealSlot(int,QString))); //SIGNAL SLOT 将函数名字 -> 字符串,不进行错误检查 resize(300,400);}void mainWidget::dealSlot(int a, QString str){ // str.toUtf8() -> 字节数组QByteArray // ...data() -> QByteArray -> char* qDebug() << a << str.toUtf8().data();}void mainWidget::changeWin(){ //子窗口显示 subw.show(); //本窗口隐藏 this->hide();}void mainWidget::dealSub(){ //子窗口隐藏 subw.hide(); //本窗口显示 this->show();}void mainWidget::mySlot(){ b2->setText("666"); setWindowTitle("niha");}mainWidget::~mainWidget(){}
subWidget.cpp
#include "subwidget.h"subWidget::subWidget(QWidget *parent) : QWidget(parent){ this->setWindowTitle("小弟"); b.setParent(this); b.setText("切换到主窗口"); connect(&b,&QPushButton::clicked,this,&subWidget::sendSlot); resize(300,400);}void subWidget::sendSlot(){ emit mySignal(); emit mySignal(250,"我是子窗口");}