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(); //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 <QWidget> #include <QPushButton> class subWidget : public QWidget { Q_OBJECT public: 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" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); mainWidget w;//执行mainwidget的构造函数 w.show(); return a.exec(); }
mainWidget.cpp
#include "mainwidget.h" #include <QDebug> //打印 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,"我是子窗口"); }