07 自定义信号与槽

自定义信号与槽必须要:
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 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值