Qt事件:自定义事件

qt的自定义事件分成两个步骤:

1、注册一个自定义事件的类型值

2、继承QEvent,继承时指定注册的类型值

下面注册一个文本改变事件。

#include <QEvent>
#include <QString>

extern int TextChangeEvent;

class textChangeEvent : public QEvent
{
public:
    textChangeEvent();

    virtual ~textChangeEvent();

    void setString(QString string)
    {
        this->newString = string;
    }

    QString getString()const
    {
        return this->newString;
    }

private:
    QString newString;
};
int TextChangeEvent = QEvent::registerEventType();//1、注册自定义事件类型

textChangeEvent::textChangeEvent():QEvent(Type(TextChangeEvent)) //2、指定事件类型
{
}

textChangeEvent::~textChangeEvent()
{

}

非常简单的代码,自定义文本改变事件里定义了一个QString用来保存改变之后的文本。

然后来使用这个事件:

界面添加一个编辑框和按钮,当按钮按下时生成一个自定义的文本改变事件:

void Widget::on_pushButton_clicked()
{
    QString text = ui->lineEdit->text().trimmed();
    textChangeEvent * event = new textChangeEvent;
    event->setString(text);
    qApp->postEvent(this, event);
}

注意事件只能定义在堆上,也不用手动释放,系统会自动释放的。

    qApp->postEvent(this, event);

这句的意思是由程序将事件添加到事件队列,此事件分配给this来处理。qApp的本质 ,qApp实际上就是main()里的QApplication a,程序开始的时候开启了一个事件循环a.exec(),这里是将此事件添加到QApplication a的事件循环队列中,并指派此事件最终由this来处理

事件处理:

事件处理有两种方式。

1、在自定义事件处理函数customEvent中处理

void Widget::customEvent(QEvent *event)
{
    int type = event->type();
    if (type == TextChangeEvent)
    {
        textChangeEvent * e = dynamic_cast<textChangeEvent*>(event);
        qDebug()<<"从自定义事件获取编辑框的文本:"<<e->getString();
        event->accept();
    }
}

customEvent是重载自QObject的专门处理自定义事件的函数,自定义事件都会被分配到这里处理

效果:

2、在事件过滤器中处理

将本对象添加到程序的事件过滤器

    qApp->installEventFilter(this);
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type() == TextChangeEvent)
    {
        textChangeEvent * e = dynamic_cast<textChangeEvent*>(event);
        qDebug()<<"事件过滤器--从自定义事件获取编辑框的文本:"<<e->getString();
        event->accept();
    }
}

效果:

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值