本文章主要通过代码的形式讲解QT中connect函数对于信号和槽函数的连接。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
//创建一个按钮
// QPushButton *btn = new QPushButton("下课",this);
//show以顶层方式弹出窗口控件
/* btn -> show();*///此处直接调用show函数会导致按钮不会再主框中显示,而是单独作为一个界面显示
// btn ->setParent(this);//指定QWidget作为btn的父类,其中this是作为QWidget的指针
// btn -> setText("第一个按钮");//显示文本
//创建二个按钮
// QPushButton *btn1 = new QPushButton("第二个按钮",this);
// btn1->move(100,100);//按钮键的移动
// resize(600,400);//设定主窗口大小
// setFixedSize(600,400);//设置固定窗口大小
// setWindowTitle("窗口");//设置窗口标题
ui->setupUi(this);
//创建一个老师的对象,
this ->zt = new teacher(this);
//创建一个学生的对象
this ->st = new student(this);
// connect(zt,&teacher::hunger,st,&student::treat);
void(teacher::* teacherSignal0)() = &teacher::hunger;
void(student::* studentSlot0)(void) = &student::treat;
connect(zt,teacherSignal0,st,studentSlot0);
//引用重构函数时需要建立指针来指向具体的函数地址,否则计算机将无法判断程序执行的具体函数
void (teacher::* teachersignal)(QString) = &teacher::hunger;
void (student::* studentsignal)(QString) = &student::treat;
connect(zt,teachersignal,st,studentsignal);
// classisover();
QPushButton* btn = new QPushButton("下课",this);
connect(btn,&QPushButton::clicked,zt,teacherSignal0);//此处不能调用teachersignal,否则会报错(信号与槽不匹配)static assertion failed: Signal and slot arguments are not compatible.
// connect(btn,&QPushButton::clicked,this,&MainWindow::classisover);
disconnect(zt,teachersignal,st,studentsignal);//断开连接
}
void MainWindow::classisover()
{
//emit用于触发自定义信号
emit zt ->hunger();
emit zt ->hunger("老师饿了");
qDebug() << "------------";
}
MainWindow::~MainWindow()
{
delete ui;
}
上述代码在我首次编写时由于疏忽使得连接的槽函数为带参槽函数“connect(btn,&QPushButton::clicked,zt,teachersignal);”导致运行时出现了“(信号与槽不匹配)static assertion failed: Signal and slot arguments are not compatible.”。导这错误的原因在于信号与槽函数数据类型不匹配。
上述阐述为个人理解,如果有措辞不当或不准确的地方请批评指正。