Qt中信号和事件的区别

一、Qt 信号槽机制

信号和槽函数是Qt中非常成功的一种机制,类似设计模式中的观察者模式:当一个对象产生某个事件,发出相应的信号,如果另外某个对象对这个信号(SIGNAL)感兴趣可以用Qt内部的connect函数将自己的某个需要执行的函数(SLOT)连接到这个信号,当信号发出时槽函数(SLOT)执行。Qt5信号槽连接方式如下:

// !!! Qt 5
#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton button("Quit");
    QObject::connect(&button, &QPushButton::clicked, &app, &QApplication::quit);
    button.show();

    return app.exec();
}

发出信号的对象是QPushButton,点击按钮发出一个clicked信号,这个信号被app对象接收,执行quit函数退出程序。

二、QT事件

Qt的事件来自与操作系统,系统捕获到各种硬件操作,例如鼠标按下,键盘按下,鼠标移动等。Qt从系统得到事件并封装到QEvent对象中。Qt的信号来自于哪里,我们从下面的代码中可以找到结论。

#include "widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    testPushButton * testBtn = new testPushButton("testPushButton",this);
    connect(testBtn,SIGNAL(clicked()),this,SLOT(onTestButtonClicked()));
}
void Widget::onTestButtonClicked()
{
    qDebug()<<"slot---buttonClicked()";
}

上述代码自定义一个QPushButton,定义槽函数,按钮按下时,打印出测试文字:

“slot—buttonClicked()”
“slot—buttonClicked()”
“slot—buttonClicked()”

接着打开QPushButton默认的事件处理函数

void myPushButton::mouseReleaseEvent(QMouseEvent *e)
{
	qDebug()<<"event---mouseReleaseEvent";
	QPushButton::mouseReleaseEvent(e);//默认事件处理
}

打印输出如下

“event—mouseReleaseEvent”
“slot—buttonClicked()”
“event—mouseReleaseEvent”
“slot—buttonClicked()”

可以看到槽函数和事件都被触发。
当我们重写事件处理函数,屏蔽默认事件处理函数。

void myPushButton::mouseReleaseEvent(QMouseEvent *e)
{
	qDebug()<<"event---mouseReleaseEvent";
	//QPushButton::mouseReleaseEvent(e);//默认事件处理
}

输出如下:

“event—mouseReleaseEvent”
“event—mouseReleaseEvent”

三、结论

由上面的现象我们可以得出结论:

  1. 信号来自事件
  2. 信号由默认的事件处理函数发出
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值