Qt 自定义事件

其实Qt自定义事件相对来说还是比较好用的,其优点实在有不必像使用信号和槽那样,使用非常多的connect,代码简洁,简单阐述如下:

使用自定义事件需要关注三方面:

1、自定义事件类型

2、事件发送

3、事件接收

使用起来比较简单,需要继承QEvent,同时提供一个大于1000 小于65535 的QEvent::Type类型的参数,该参数在QEvent类中是enum类型的枚举。

定义事件类型可以使用静态函数registerEventType,但是个人喜欢继承父类构建自己的事件类型

QEvent(const QEvent &other);

构建自己的事件类型,比如下图,定义一个获取通信的唯一序列号的事件子类,该事件包含自己的参数,供通信交互使用。

上图给出了两个自定义事件类,自定义的Board_MN可以是1000,Board_SoftVersion可以是1001。有了自定义事件子类添加需要传输的数据,接下来就是发送事件了。

Qt提供了两种最常用的事件发送函数,Qt提供两个静态函数供使用,分别是栈上同步发送static bool sendEvent,和在堆上new出来的异步发送postEvent。如下图所示,第一个参数是要发送给那个对象也就是接收者,第二个是实例化的自定义事件子类。

 有了发送函数接下来是,接收者的事件处理函数。

Qt的QObject为我们提供了event()函数,比如某个界面类只需要重写该函数即可接收事件,完成对事件的处理,任何继承QObject的子类都可以重写该函数完成事件的接收。比如某个自定义界面的event()重写函数。

bool CustomWidget::event(QEvent *event) {
        if (event->type() == MyCustomEventType) {
                CustomEvent *myEvent = static_cast<CustomEvent *>(event);
                // processing...
                return true;
        }

        return QWidget::event(event);
}

比如某个信息界面接收MN号和软件版本号的event()重写函数。

 

想知道事件具体通信过程请看下图:

       对于和界面或者其他对象进行交互的自定义事件,想要进行通信必须知道界面对象,这里有个小技巧:可以使用QMap<QString, int>,键QString可以定义该界面唯一的字符串比如参数设置界面“PARASETPAGE”避免和其他界面重复,值int表示该界面的实例对象在构造时候传入this指针即可。这样在每个实例化界面都添加到map表中,事件通信时候通过键找到对应的对象即可发送事件;

总结:

1、首先将需要通信的对象和类型放在一个map表,QMap(type,object);

2、通过postEvent(receiver, event);找到步骤一中的对象,放到参数1位置,将事件类型放到参数2位置,那么post后。

3、接着在object的子类中重写event函数(类似重写鼠标按压事件等功能,只不过鼠标等事件是用户提前知道要处理的对象,这里是将发送的对象通过receiver,告知接收者需要处理event)。

经过以上三个步骤完成,信号的创建 -》发送-》处理

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以通过自定义控件的鼠标事件来实现对鼠标操作的响应。下面是一般的步骤: 1. 继承QWidget或QAbstractButton等基类,创建自定义控件类。 2. 重写自定义控件类的鼠标事件处理函数,如mousePressEvent、mouseReleaseEvent、mouseMoveEvent等。 3. 在重写的鼠标事件处理函数中,根据需要实现相应的功能逻辑。 例如,如果你想在自定义控件上实现鼠标点击事件的响应,可以按照以下步骤进行: 1. 创建一个继承自QWidget的自定义控件类,例如MyWidget。 2. 在MyWidget类中重写mousePressEvent函数,该函数会在鼠标按下时被调用。 3. 在mousePressEvent函数中实现你想要的功能,比如显示一个提示框或改变控件的状态等。 下面是一个简单的示例代码: ```cpp #include <QWidget> #include <QMouseEvent> class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) {} protected: void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { // 左键点击事件处理逻辑 // 例如显示一个提示框 qDebug() << "Left button pressed!"; } // 调用父类的事件处理函数,保证其他事件正常处理 QWidget::mousePressEvent(event); } }; ``` 在上述示例中,我们重写了MyWidget类的mousePressEvent函数,并在函数中判断鼠标按下的按钮是否为左键,如果是则输出一条调试信息。同时,我们还调用了父类的mousePressEvent函数,以确保其他事件的正常处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值