PyQt事件处理和QErrorMessage:检测单击的源

PyQt事件处理和QErrorMessage:检测单击的源,qt,python-2.7,event-handling,pyqt,mouseclick-event,Qt,Python 2.7,Event Handling,Pyqt,Mouseclick Event,我是Python和Qt新手,有以下问题: 我已经重写了类mywin(QMainWindow)的事件处理程序:,因此当我单击它时,应该执行一个命令。但是,当命令返回错误时,我希望使用QErrorMessage显示错误消息。但是,当我单击错误消息的“确定”按钮时,会注册另一个单击事件,命令会重新执行错误并显示新的错误消息,因此我无法退出错误消息(每次关闭时,另一个错误消息会重新打开) 编辑: 下面是eventFilter的注册 if __name__ == '__main__': app

我是Python和Qt新手,有以下问题: 我已经重写了
类mywin(QMainWindow)的事件处理程序:
,因此当我单击它时,应该执行一个命令。但是,当命令返回错误时,我希望使用
QErrorMessage
显示错误消息。但是,当我单击错误消息的“确定”按钮时,会注册另一个单击事件,命令会重新执行错误并显示新的错误消息,因此我无法退出错误消息(每次关闭时,另一个错误消息会重新打开)

编辑: 下面是eventFilter的注册

if __name__ == '__main__': 
    app = QApplication(sys.argv)
    print "OS Name:"+os.name
    main = mywin()
    main.show()
    app.installEventFilter(main)
    sys.exit(app.exec_())
如果我登录

  • 源代码点击文本区域,我得到:
  • self.text编辑,我得到

installEventFilter的文档:

对于来自
mywin
QErrorMessage
对象的点击事件,
source
参数不应该不同吗?如果是,您可以检查它并阻止重新执行。

对于来自
mywin
QErrorMessage
对象的单击事件,
source
参数不应该不同吗?如果是,您可以检查它并防止重新执行。

首先,您应该显示注册事件筛选器的代码。
第二种方法是验证这是一个事件,您要筛选的内容不太好。您应该验证特定的小部件,而不是类型,因此它应该类似于:

def eventFilter(self, source, event):
    if event.type() == QEvent.MouseButtonPress:
        if source == self.txtEditor :
            pos=event.pos()
            cursor=self.txtEditor.cursorForPosition(pos)
            cursor.select(QTextCursor.WordUnderCursor)
            txtClicked=cursor.selectedText()
            self.testCommand(str(txtClicked))
    return QMainWindow.eventFilter(self, source, event)

编辑:

正如我所怀疑的:您正在缓存所有小部件的所有事件,因为您已经在QApplication对象上安装了事件过滤器。在小部件上注册事件过滤器,以跟踪鼠标事件。在事件筛选器中使用我上面写过的使用条件。

首先,您应该显示注册事件筛选器的代码。
第二种方法是验证这是一个事件,您要筛选的内容不太好。您应该验证特定的小部件,而不是类型,因此它应该类似于:

def eventFilter(self, source, event):
    if event.type() == QEvent.MouseButtonPress:
        if source == self.txtEditor :
            pos=event.pos()
            cursor=self.txtEditor.cursorForPosition(pos)
            cursor.select(QTextCursor.WordUnderCursor)
            txtClicked=cursor.selectedText()
            self.testCommand(str(txtClicked))
    return QMainWindow.eventFilter(self, source, event)

编辑:

正如我所怀疑的:您正在缓存所有小部件的所有事件,因为您已经在QApplication对象上安装了事件过滤器。在小部件上注册事件过滤器,以跟踪鼠标事件。在事件过滤器中使用我上面写过的使用条件。

可能,但我如何测试它?如果
源代码=self.errorMessage
?我的问题是我需要访问errorMessage的按钮。可能吧,但我如何测试它?如果
源代码=self.errorMessage
?我的问题是我需要访问errorMessage的按钮。下面是我注册事件过滤器的代码:
如果_uuname_uuu=='uuuu main_uuu':app=QApplication(sys.argv)打印“OS name:+OS.name main=mywin()main.show()app.installEventFilter(main)sys.exit(app.exec_x())
如果我点击文本区域记录源代码,我会得到:
,如果我记录self.textEdit,我会得到
您如何准确注册eventFilter?函数是否可以在类之外?
installEventFilter
是QObject类的方法形式。所以所有的小部件都有它。因此,在
mywin
constructor的底部添加
self.txtEditor.installEventFilter(self)
并删除
app.installEventFilter(main)
(正如我在开始时所写的那样,也更正事件筛选器中的条件)。下面是我注册事件筛选器的代码:
如果uuuuuu name\uuuuuu=='uuu main\uuuuuuuu':app=QApplication(sys.argv)打印“OS Name:+OS.Name main=mywin()main.show()app.installEventFilter(main)sys.exit(app.exec))
如果单击文本区域记录源代码,我会得到:
,如果我记录self.textEdit,我会得到
如何准确注册事件过滤器?函数是否可以在类之外?
installEventFilter
是QObject类的方法形式。所以所有的小部件都有它。因此,在
mywin
constructor的底部添加
self.txtEditor.installEventFilter(self)
并删除
app.installEventFilter(main)
(正如我在开始时所写的那样,也更正事件筛选器中的条件)。