07 自定义信号与槽

来源:互联网 发布:巨人网络股票吧 编辑:程序博客网 时间:2024/05/30 07:14

自定义信号与槽必须要:
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_OBJECTprivate:    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_OBJECTprivate:    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 ;}
0 0
原创粉丝点击