2

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

def eventFilter(self, source, event):
    if event.type() == QEvent.MouseButtonPress:
        if isinstance(source, QWidget):
            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)

def testCommand(self, textClicked=None):
            #Command executing and error finding
            if error:   
             errorMessage=QErrorMessage(self)
             errorMessage.showMessage(a)

编辑:

这是eventFilter的注册

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

如果我登录

  • 单击文本区域的源,我得到:<PyQT4.QtGui.QWidget object at 0x000000000028B30D0>
  • self.textEdit,我明白了<PyQT4.QtGui.QTextEdit object at 0x000000000028B3268>

installEventFilter 文档:http: //harmattan-dev.nokia.com/docs/platform-api-reference/xml/daily-docs/libqt4/qobject.html#installEventFilter

4

2 回答 2

3

首先,您应该显示注册事件过滤器的代码。
其次,您正在验证这是您要过滤的事件不太好。您应该验证特定的小部件而不是类型,所以它应该是这样的:

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 对象上安装了事件过滤器。在小部件上注册事件过滤器,以便跟踪鼠标事件。在事件过滤器中使用我上面写的使用条件。

于 2013-07-16T21:24:00.317 回答
1

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

于 2013-07-04T13:56:51.993 回答