了解 contextMenuEvent(或任何一般事件)在 PyQt5 中的工作原理

Posted

技术标签:

【中文标题】了解 contextMenuEvent(或任何一般事件)在 PyQt5 中的工作原理【英文标题】:Understanding how contextMenuEvent (or any event in general) works in PyQt5 【发布时间】:2020-08-02 09:13:32 【问题描述】:

下面是生成一个空窗口的代码,当您右键单击它时,它会打印“上下文菜单事件!”。我只是想知道(粗略地)PyQt5 是如何实现的,因为我觉得把它当作一个完整的黑匣子来处理并不自在。所以我猜你在这里覆盖QMainWindowcontextMenuEvent 通过将其简化为仅仅print 函数,但这与右键单击有什么关系?从我右键单击到“上下文菜单事件!”时,PyQt5 采取的步骤是什么?打印出来了吗?

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

    def contextMenuEvent(self, event):
        print("Context menu event!")


app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

【问题讨论】:

【参考方案1】:

PyQt5 基本上等待事件发生,然后在事件发生后将其路由到事件的目标对象。

使用app.exec_(),您正在启动 Qt 事件循环。在您的情况下,事件循环将等待事件(用户输入、计时器、网络流量、传感器等),这意味着鼠标单击,并在收到事件后,将事件分派给已订阅它们的对象(在你的情况是你的主窗口)。事件循环是编程中的一个常见概念see wikipedia。

您可以在此处找到 Qt 事件循环的代码:https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qeventloop.cpp.html#224

【讨论】:

以上是关于了解 contextMenuEvent(或任何一般事件)在 PyQt5 中的工作原理的主要内容,如果未能解决你的问题,请参考以下文章

Python PyQt5 QTableWidget contextMenuEvent setStyleSheet 子菜单背景色

Qt 我如果在QWidget::contextMenuEvent函数中new QMenu来实现右键菜单,是不是会造成内存泄露?

持久性设计一般问题

通过完善邮箱匹配来一步步学习正则表达

逆向工程师要学啥?工资一般是多少?

学习:图论----一般图