本章内容也是关于Qt事件。或许这一章不能有一个完整的例子,因为对于事件总是感觉很抽象,还是从底层上理解一下比较好的吧!
前面说到了事件的作用,下面来看看我们如何来接收事件。回忆一下前面的代码,我们在子类中重写了事件函数,以便让这些子类按照我们的需要完成某些功能,就像下面的代码:
void
MyLabel::mousePressEvent(QMouseEvent *
event
)
{
if
(
event
->button() == Qt::LeftButton) {
// do something
}
else
{
QLabel::mousePressEvent(
event
);
}
}
上面的代码和前面类似,在鼠标按下的事件中检测,如果按下的是左键,做我们的处理工作,如果不是左键,则调用父类的函数。这在某种程度上说,是把事件向上传递给父类去响应,也就是说,我们在子类中“忽略”了这个事件。
我们可以把Qt的事件传递看成链状:如果子类没有处理这个事件,就会继续向其他类传递。其实,Qt的事件对象都有一个accept()函数和
ignore()函数。正如它们的名字,前者用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;后者则告诉Qt,事件处理函数“忽略”了这个事
件,需要继续传递,寻找另外的接受者。在事件处理函数中,可以使用isAccepted()来查询这个事件是不是已经被接收了。
事实上,我们很少使用accept()和ignore()函数,而是想上面的示例一样,如果希望忽略事件,只要调用父类的响应函数即可。记得我们曾经说
过,Qt中的事件大部分是protected的,因此,重写的函数必定存在着其父类中的响应函数,这个方法是可行的。为什么要这么做呢?因为我们无法确认
父类中的这个处理函数没有操作,如果我们在子类中直接忽略事件,Qt不会再去寻找其他的接受者,那么父类的操作也就不能进行,这可能会有潜在的危险。另外
我们查看一下QWidget的mousePressEvent()函数的实现:
void
QWidget::mousePressEvent(QMouseEvent *
event
)
{
event
->ignore();
if
((windowType() == Qt::Popup)) {
event
->accept();
QWidget* w;
while
((w = qApp->activePopupWidget()) && w !=
this
){
w->close();
if
(qApp->activePopupWidget() == w)
// widget does not want to dissappear
w->hide();
// hide at least
}
if
(!rect().contains(
event
->pos())){
close();
}
}
}
请注意第一条语句,如果所有子类都没有覆盖mousePressEvent函数,这个事件会在这里被忽略掉,这暗示着这个组件不关心这个事件,这个事件就可能被传递给其父组件。
不过,事情也不是绝对的。在一个情形下,我们必须使用accept()和ignore()函数,那就是在窗口关闭的时候。如果你在窗口关闭时需要有个询问对话框,那么就需要这么去写:
void
MainWindow::closeEvent(QCloseEvent *
event
)
{
if
(continueToClose()) {
event
->accept();
}
else
{
event
->ignore();
}
}
bool
MainWindow::continueToClose()
{
if
(QMessageBox::question(
this
,
tr(
"Quit"
),
tr(
"Are you sure to quit this application?"
),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No)
== QMessageBox::Yes) {
return
true
;
}
else
{
return
false
;
}
}
这样,我们经过询问之后才能正常退出程序。
本文出自 “豆子空间
” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/225519
分享到:
相关推荐
- **事件处理**:深入理解Qt的事件机制,包括事件的传递、接收与忽略,以及如何自定义事件。掌握这些技巧可以帮助开发者更好地控制用户界面的行为。 - **绘图功能**:Qt提供了强大的绘图功能,包括使用QPainter进行...
- **知识点**:Qt中的事件处理机制、事件的类型、事件的接收与忽略、事件过滤器的使用。 - **重要性**:事件处理是任何图形界面程序的核心,理解事件如何传递并被处理对于编写响应式的程序至关重要。 - **自定义...
10. "事件"、"事件接收与忽略"、"事件过滤器"、"自定义事件" 这些章节则围绕Qt中的事件处理机制,包括事件的捕获、处理和过滤。 11. "QPAINTER" 和绘图相关的章节可能包括了如何使用QPainter类进行2D图形绘制,包括...
10. **事件处理** —— 介绍Qt的事件系统,包括事件的接收、忽略、自定义等。 11. **QPainter** —— 了解Qt的绘图系统,学会如何使用QPainter进行高级图形绘制。 12. **Graphics View Framework** —— 探索Qt的...
Qt5学习之路2涵盖了多个方面的知识点,这包括但不限于Qt基础,GUI组件,信号槽机制,Qt模块,事件处理,绘图系统,模型/视图架构,网络与数据库操作,以及QML和QtQuick2。本部分将会对这些知识点做详细说明。 ### ...
笔记中提到的“事件接收与忽略”、“事件过滤器”和“自定义事件”部分,将帮助学习者掌握Qt中的事件处理机制。 ### 绘图系统 Qt的绘图系统包括QPainter类,用于2D绘图。它提供了强大的绘图能力,可以绘制图形、...
在使用Qt进行UDP通信时,可能会遇到一种情况,即当发送方停止发送数据报文时,接收方仍能接收到空的报文。这通常是因为UDP的特性导致的。UDP(User Datagram Protocol)是一个无连接、不可靠的传输层协议,它不保证...
信号与槽机制是Qt框架的核心之一,它极大地简化了对象间的通信过程,提高了代码的可维护性和可扩展性。理解并掌握信号与槽的使用方法对于开发高效的Qt应用至关重要。通过本文的介绍,相信您已经对Qt中的信号与槽机制...
一个信号可以连接多个槽,也可以与其他信号连接,同时,信号和槽的参数需要匹配,但信号参数多余的部分会被忽略。如果参数类型不匹配或信号/槽不存在,Qt会在调试模式下给出警告。 Qt的元对象系统是其另一个重要...
- 组件可以接受或忽略接收到的事件,通过重写`QWidget::event`函数来实现对事件的自定义处理。 **3.3 事件过滤器** - **事件过滤:** - 事件过滤器允许在事件传递到目标对象之前对其进行拦截和预处理。 - 可以...
在Qt编程中,拖放(Drag and Drop)和鼠标事件是构建用户界面的重要部分,它们提供了与用户交互的直观方式。下面将详细讲解Qt中的拖放事件、鼠标进入离开事件,以及相关的源代码实现。 首先,让我们来看看拖放事件...
**Qt核心机制与原理之信号与槽:深入理解与实战** Qt库,作为一个强大的跨平台应用开发框架,其核心机制之一就是信号与槽(Signals & Slots)机制。这个机制为对象间的通信提供了一种安全、灵活的方式,是Qt区别于...
在Qt框架中,事件过滤器是用于拦截和处理对象间通信的一种机制,它允许我们对特定对象或其子对象接收到的事件进行监控和处理。本文将深入探讨Qt中的事件过滤器及其源文件,以便更好地理解和应用这一强大的功能。 ...
在Qt框架中,事件过滤器(EventFilter)是一种强大的机制,允许我们监控和处理其他对象接收到的事件。本文将详细介绍如何使用`EventFilter`为Qt对象,如`QPushButton`,添加快捷键并过滤特定事件,确保用户只能通过...
- `Qt::WA_OpaquePaintEvent`:如果一个控件设置了这个属性,那么它的paint事件会被忽略,从而提高性能,但不适用于需要透明背景的情况。 2. **自定义绘图:** 如果需要更复杂的透明效果,可以重写`paintEvent`...
【标题】"qt_eventdispatcher_libevent-master.zip" 是一个与Qt框架相关的开源项目压缩包,其核心内容是将Libevent库集成到Qt事件调度系统中,以增强Qt应用程序的网络事件处理能力。Libevent是一个著名的跨平台事件...
这个压缩包很可能包含了一系列关于Qt事件的示例代码、教程文档或者演示项目,帮助开发者更直观地学习如何在实践中使用Qt事件系统。例如,可能会有各种事件类型的处理示例,如窗口关闭事件(QCloseEvent)、定时器...
在Qt框架中,键盘事件处理是应用程序与用户交互的关键部分,尤其对于文本输入和游戏控制等场景至关重要。Qt 键盘源码分析将帮助我们深入理解这一核心组件的工作原理,以便于自定义键盘行为或优化性能。下面我们将...