自定义信号与槽必须要:
1. 用一个头文件, 一个源文件来描述一个类.
.h头文件用于定义类里有什么属性成员,函数成员(不实现函数体)等。
类的函数成员在.cpp源文件里实现函数体.
2. 在类的private段里写宏<Q_OBJECT>
编译出现mywin.cpp:5: undefined reference to `vtable for MyWin'
这种问题时,调整下pro工程管理文件里: QT += 库的顺序即可. (QT的老bug)
一. 自定义槽
槽实际上就一个函数,只需声明为槽即可. 槽函数可以分权限.
例如实现一个槽函数,当按钮按下时弹出框:
mywin.h
#ifndef MYWIN_H
#define MYWIN_H
#include <QWidget>
#include <QPushButton>
class MyWin : public QWidget {
Q_OBJECT
private:
QPushButton *btn;
public:
MyWin(QWidget *parent=NULL);
~MyWin();
public slots:
void myslot();
};
#endif // MYWIN_H
mywin.cpp
#include "mywin.h"
#include <QMessageBox>
MyWin::MyWin(QWidget *parent) : QWidget(parent)
{
btn = new QPushButton(this);
btn->setText("hello");
btn->setGeometry(0, 0, 100, 60);
connect(btn, SIGNAL(pressed()), this, SLOT(myslot()));
resize(640, 480);
}
MyWin::~MyWin()
{
delete btn;
}
void MyWin::myslot()
{
QMessageBox::critical(this, "error", "power off");
}
main.cpp
#include <QApplication>
#include "mywin.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWin win;
win.show();
return a.exec();
}
二. 自定义信号
自定义信号其实就是声明一个函数的原型,不实现它的函数体. 信号不能指定权限。而且自定义的信号不会自动发出, 只能自己写代码来发出信号。
修改上面的例子,增加一个mysig(int)信号,当按钮按下时,发出信号并传参数.
mywin.h
class MyWin : public QWidget {
Q_OBJECT
private:
QPushButton *btn;
signals:
void mysig(int val);
public:
MyWin(QWidget *parent=NULL);
~MyWin();
public slots:
void myslot();
void myslot2(int val); //用于连接信号mysig
};
mywin.cpp
MyWin::MyWin(QWidget *parent) : QWidget(parent)
{
btn = new QPushButton(this);
btn->setText("hello");
btn->setGeometry(0, 0, 100, 60);
connect(btn, SIGNAL(pressed()), this, SLOT(myslot()));
connect(this, SIGNAL(mysig(int)), this, SLOT(myslot2(int)));
resize(640, 480);
}
MyWin::~MyWin()
{
delete btn;
}
void MyWin::myslot()
{
QMessageBox::critical(this, "error", "power off");
static int n = 0;
//发出信号mysig(int)
emit mysig(n++);
}
void MyWin::myslot2(int val)
{
qDebug() << val ;
}