4、自定义槽函数、自定义信号
1、创建两个窗口,分别点击对方窗口中的一个按牛,隐藏自己 显示对方
2、主窗口MainWindow、子窗口subWind,主窗口可以让子窗口隐藏,但是子窗口不可以让主窗口隐藏
#include <QMainWindow> #include <QPushButton> #include "subwind.h" // 将子窗口包含进来 // 在头文件中添加 void changwind_slot(); // 主窗口按钮槽函数 void dealsignal(); // 处理子窗口发过来信号的槽函数 QPushButton b1; // 主窗口按钮对象 subwind w; // 子窗口对象,与b1相对于主窗口一样,具有相同的属性 可当做b1使用
3、在主窗口的构造函数中实现
b1.setParent(this); b1.setText("切换到小弟"); b1.move(50,50); b1.resize(80,40); this->setWindowTitle("老大"); this->resize(300,400); // 处理按钮信号 connect(&b1,&QPushButton::pressed,this,&MainWindow::changwind_slot); // 处理小弟发过来的信号 connect(&w,&subwind::mysignals,this,&MainWindow::dealsignal); } // 槽函数实现 void MainWindow::dealsignal() { // 显示主窗口 show(); // 隐藏子窗口 w.hide(); } // 槽函数 实现 void MainWindow::changwind_slot() { // 隐藏主窗口 hide(); // 显示子窗口 w.show(); }
4、子窗口头文件中实现
private: QPushButton b; signals: void mysignals(); // 自定义信号 /* 信号可以传递参数,也可以不传参数 * 信号没有返回值 * 必须使用关键字signals声明 * 只需声明,不能实现,编译器会自动实现 * 调用:emit mysignals(); */ public slots: void sendsignal(); // 自定义槽函数 处理按钮b的信号,以发送槽函数
5、子窗口构造函数中实现
subwind::subwind(QWidget *parent) : QWidget(parent) { setWindowTitle("小弟"); b.setParent(this); b.setText("切换到老大");\ b.move(100,100); // 处理按钮发送的信号 connect(&b,&QPushButton::released,this,&subwind::sendsignal); } // 自定义槽函数 void subwind::sendsignal() { emit mysignals(); }
6、connect理解,属于Qt核心机制之一,广泛应用于类间通信
connect(A,B,C,D) // 四个位置的参数分别说明 A:发送信号者,来自于哪一个控件、对象、类 B:A对象发送哪一个信号; C:哪一个对象、控件接收B信号 D:C接收了B信后,需要做什么样的动作
7、信号重载
signals: void mysignals(); void mysignals(int,QString); // 带参数的信号 /*信号必须有signals关键字 * 信号没有返回值,但可以有参数 * 信号就是函数的声明 只需声明 无需定义 * 使用 emit mysignals(); * 信号可以重载 * 信号给槽函数传参数 */ public slots: // 发送信号的槽函数 void myslot();
8、处理重载的信号,重载信号需要解决如何分辨是哪一个信号,通过信号传递的参数,进行分辨
// 函数指针用法 void fun() { } // 定义一个函数指针 void (*p)()= fun; // 处理函数重载 使用函数指针 void (SubWidget::*testsigl)() = &SubWidget::mysignals; connect(&w,testsigl,this,&mainWidget::dealsubwin); void (SubWidget::*paramsignal)(int ,QString) = &SubWidget::mysignals; connect(&w,paramsignal,this,&mainWidget::dealslot); // 处理带参数信号的 槽函数 void mainWidget::dealslot(int a,QString str) { qDebug()<<a<<str.toUtf8().data(); // qt4可以不用转换,qt5需要转换 // .toYTF8()转到字节数组 // .data转到char* }

浙公网安备 33010602011771号