当前位置: 首页 > news >正文

Qt重写相关事件,原来的默认功能是不是丢失了?

在Qt中,QWidget 类本身确实提供了 mousePressEventmouseReleaseEvent 的默认实现。这些默认实现是Qt框架的一部分,用于处理鼠标事件的基本逻辑。如果你不重写这些函数,QWidget 的默认实现仍然会被调用。

默认行为

  • mousePressEvent(QMouseEvent *event)

    • 默认情况下,QWidgetmousePressEvent 会处理一些基本的鼠标按下事件,例如设置焦点、更新鼠标光标等。对于大多数控件,这个事件会被用来启动拖动操作或处理其他与鼠标按下相关的逻辑。
    • 如果你没有重写这个函数,事件会继续向上传递到父控件,直到被某个控件处理或到达顶层窗口。
  • mouseReleaseEvent(QMouseEvent *event)

    • 默认情况下,QWidgetmouseReleaseEvent 会处理鼠标释放事件,例如结束拖动操作或更新控件状态。
    • 同样,如果你没有重写这个函数,事件会继续向上传递到父控件。

为什么需要重写

当你重写这些函数时,你是在扩展或修改默认行为。例如,你可以在 mousePressEvent 中添加自定义逻辑来改变控件的样式,或者在 mouseReleaseEvent 中发射自定义信号。

示例说明

在你的 ClickableWidget 示例中,你重写了 mousePressEventmouseReleaseEvent 来实现点击效果。如果你不重写这些函数,QWidget 的默认行为将被调用,但不会实现你想要的点击效果。

示例代码对比

不重写时的行为

如果你不重写 mousePressEventmouseReleaseEventClickableWidget 的代码将如下所示:

#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QApplication>class ClickableWidget : public QWidget
{Q_OBJECTpublic:explicit ClickableWidget(QWidget *parent = nullptr) : QWidget(parent){// 设置样式this->setStyleSheet("QWidget{background-color: lightgray; border: 1px solid black; padding: 10px;}");QLabel *label = new QLabel("Click Me", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(label);this->setLayout(layout);}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);ClickableWidget *widget = new ClickableWidget();layout->addWidget(widget);window.setLayout(layout);window.show();return app.exec();
}

在这种情况下,点击 ClickableWidget 不会产生任何特殊效果,因为 QWidget 的默认实现不会改变控件的样式或发射自定义信号。

重写后的行为

当你重写 mousePressEventmouseReleaseEvent 时,你可以实现自定义逻辑,例如改变背景颜色和发射点击信号:

#include <QWidget>
#include <QMouseEvent>
#include <QVBoxLayout>
#include <QLabel>
#include <QApplication>
#include <QDebug>class ClickableWidget : public QWidget
{Q_OBJECTpublic:explicit ClickableWidget(QWidget *parent = nullptr) : QWidget(parent){// 设置样式this->setStyleSheet("QWidget{background-color: lightgray; border: 1px solid black; padding: 10px;}");QLabel *label = new QLabel("Click Me", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(label);this->setLayout(layout);}protected:void mousePressEvent(QMouseEvent *event) override{if (event->button() == Qt::LeftButton){// 按下时改变样式this->setStyleSheet("QWidget{background-color: darkgray; border: 1px solid black; padding: 10px;}");}QWidget::mousePressEvent(event); // 调用父类的实现}void mouseReleaseEvent(QMouseEvent *event) override{if (event->button() == Qt::LeftButton){// 释放时恢复样式this->setStyleSheet("QWidget{background-color: lightgray; border: 1px solid black; padding: 10px;}");emit clicked(); // 发射点击信号}QWidget::mouseReleaseEvent(event); // 调用父类的实现}signals:void clicked(); // 自定义点击信号
};int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);ClickableWidget *widget = new ClickableWidget();layout->addWidget(widget);window.setLayout(layout);window.show();QObject::connect(widget, &ClickableWidget::clicked, [](){qDebug() << "Widget clicked!";});return app.exec();
}

总结

  • 默认实现QWidget 的默认 mousePressEventmouseReleaseEvent 实现会处理一些基本的鼠标事件逻辑,但不会实现你想要的自定义行为。
  • 重写实现:通过重写这些函数,你可以添加自定义逻辑,例如改变控件的样式或发射自定义信号。

当你重写 mousePressEventmouseReleaseEvent 时,原来的默认功能并不会丢失,只要你记得调用父类的实现。在Qt中,当你重写一个事件处理函数时,你可以选择是否调用父类的实现。如果你不调用父类的实现,那么默认功能会被覆盖;如果你调用父类的实现,那么默认功能仍然会被保留。

调用父类的实现

在你的代码中,你可以通过调用 QWidget::mousePressEvent(event)QWidget::mouseReleaseEvent(event) 来保留父类的默认行为。这是通过在你的重写函数中显式调用父类的同名函数来实现的。

示例代码
#include <QWidget>
#include <QMouseEvent>
#include <QVBoxLayout>
#include <QLabel>
#include <QApplication>
#include <QDebug>class ClickableWidget : public QWidget
{Q_OBJECTpublic:explicit ClickableWidget(QWidget *parent = nullptr) : QWidget(parent){// 设置样式this->setStyleSheet("QWidget{background-color: lightgray; border: 1px solid black; padding: 10px;}");QLabel *label = new QLabel("Click Me", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(label);this->setLayout(layout);}protected:void mousePressEvent(QMouseEvent *event) override{if (event->button() == Qt::LeftButton){// 按下时改变样式this->setStyleSheet("QWidget{background-color: darkgray; border: 1px solid black; padding: 10px;}");}QWidget::mousePressEvent(event); // 调用父类的实现}void mouseReleaseEvent(QMouseEvent *event) override{if (event->button() == Qt::LeftButton){// 释放时恢复样式this->setStyleSheet("QWidget{background-color: lightgray; border: 1px solid black; padding: 10px;}");emit clicked(); // 发射点击信号}QWidget::mouseReleaseEvent(event); // 调用父类的实现}signals:void clicked(); // 自定义点击信号
};int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);ClickableWidget *widget = new ClickableWidget();layout->addWidget(widget);window.setLayout(layout);window.show();QObject::connect(widget, &ClickableWidget::clicked, [](){qDebug() << "Widget clicked!";});return app.exec();
}

代码说明

  1. 调用父类的实现

    • mousePressEventmouseReleaseEvent 中,通过调用 QWidget::mousePressEvent(event)QWidget::mouseReleaseEvent(event),保留了父类的默认行为。
    • 这样,你的自定义逻辑不会干扰 QWidget 的默认行为。
  2. 自定义逻辑

    • mousePressEvent 中,改变控件的背景颜色。
    • mouseReleaseEvent 中,恢复控件的背景颜色并发射自定义的 clicked 信号。

默认行为的保留

  • QWidget::mousePressEvent(event)

    • 调用父类的 mousePressEvent 会处理一些基本的鼠标按下事件,例如设置焦点、更新鼠标光标等。
    • 如果你不调用这个函数,这些默认行为将不会发生。
  • QWidget::mouseReleaseEvent(event)

    • 调用父类的 mouseReleaseEvent 会处理一些基本的鼠标释放事件,例如结束拖动操作或更新控件状态。
    • 如果你不调用这个函数,这些默认行为将不会发生。

总结

  • 调用父类的实现:通过调用 QWidget::mousePressEvent(event)QWidget::mouseReleaseEvent(event),你可以保留父类的默认行为,同时添加自定义逻辑。
  • 不调用父类的实现:如果你不调用父类的实现,那么默认行为将被覆盖,只有你的自定义逻辑会被执行。

因此,当你重写这些函数时,是否保留默认行为完全取决于你是否调用父类的实现。

http://www.xdnf.cn/news/328681.html

相关文章:

  • FFmpeg(7.1版本)编译生成ffplay
  • AI Agent(5):多Agent协作系统
  • 5.6-DAE实现
  • 背单词软件开发英语app开发,超级单词表开发,河南数匠软件开发
  • 数据结构之栈与队列
  • QT6 源(83)篇二:日期类型 QDate 的源代码,及功能测试:日期与字符串互相转换时候的格式指定,
  • 中级注册安全工程师的《安全生产专业实务》科目如何选择专业?
  • Media3 中 Window 的时间相关属性详解
  • MySQL 1205错误:Lock wait timeout exceeded问题处理
  • 词编码模型和回答问题的LLM是否为同一个; 词编码模型和回答问题模型分开时:需要保证词嵌入维度一致吗
  • 软考【软考高级QA】
  • DSENT (Design Space Exploration of Networks Tool) 配合gem5
  • 时间序列数据集增强构造方案(时空网络建模)
  • 【网络编程】二、UDP网络套接字编程详解
  • 项目文档归档的最佳实践有哪些?
  • Nacos源码—Nacos集群高可用分析(二)
  • java实现一个操作日志模块功能,怎么设计
  • 【云备份】项目展示项目总结
  • 深入理解Redis缓存与数据库不一致问题及其解决方案
  • Matlab 多策略改进蜣螂优化算法及其在CEC2017性能
  • PCI-Compatible Configuration Registers--BIST Register (Offset 0Fh)
  • 跨物种交流新时代!百度发布动物语言转换专利,听懂宠物心声
  • 电池管理系统BMS三级架构——BMU、BCU和BAU详解
  • Webug4.0靶场通关笔记20- 第25关越权查看admin
  • 读《暗时间》有感
  • 基于RT-Thread的STM32G4开发第二讲第二篇——ADC
  • 2014年写的一个文档《基于大数据应用的综合健康服务平台研发及应用示范》
  • layui下拉框输入关键字才出数据
  • JMeter快速指南:命令行生成HTML测试报告(附样例命令解析)
  • Android学习总结之网络篇补充