Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 执行;SCI_GOTOLINE“;indicatorReleased()事件处理程序中QSCINTILA的API运行不正常_Python_Pyqt_Pyqt4_Qscintilla - Fatal编程技术网

Python 执行;SCI_GOTOLINE“;indicatorReleased()事件处理程序中QSCINTILA的API运行不正常

Python 执行;SCI_GOTOLINE“;indicatorReleased()事件处理程序中QSCINTILA的API运行不正常,python,pyqt,pyqt4,qscintilla,Python,Pyqt,Pyqt4,Qscintilla,我正在使用“PyQt4”开发一个桌面应用程序。该应用程序包含一个在QSCINTILA之上实现的XML编辑器。但是,每当我单击通过指示器定义的类似超链接的文本时,我就会遇到一个问题。“indicatorClicked”事件被调用,但当我在其中执行“SCI_GOTOLINE”API时,它会正确地转到所需的行,但不幸的是,出于某种原因,它会从单击的文本位置选择文本,直到目标行。对我来说,似乎鼠标并没有被释放!我也尝试过使用“指示灯释放”事件,但没有运气!你知道怎么解决这个问题吗 这就是我如何连接到指示

我正在使用“PyQt4”开发一个桌面应用程序。该应用程序包含一个在QSCINTILA之上实现的XML编辑器。但是,每当我单击通过指示器定义的类似超链接的文本时,我就会遇到一个问题。“indicatorClicked”事件被调用,但当我在其中执行“SCI_GOTOLINE”API时,它会正确地转到所需的行,但不幸的是,出于某种原因,它会从单击的文本位置选择文本,直到目标行。对我来说,似乎鼠标并没有被释放!我也尝试过使用“指示灯释放”事件,但没有运气!你知道怎么解决这个问题吗

这就是我如何连接到指示器发布事件的方式:

self.__editor.indicatorReleased.connect(self.__on_indicator_released)
事件处理程序只是将SCI_GOTOLINE API调用到某个行号:

 def __on_indicator_released(self, line_number, index, keys):
    self.__editor.SendScintilla(QsciScintilla.SCI_GOTOLINE, line_number)

我在另一个帖子上收到了@Matic Kukovec&@K.Mulier的回复。我把它贴在这里,这样其他人可以从中受益

@Matic Kukovec回答我:“有两种解决方案:在指示器释放事件中使用QTimer.singleShot在短延迟后(我使用50ms)执行SCI_GOTOLINE,或者在指示器释放事件中使用:while mouse_state!=data.Qt.NoButton:PyQt5.QTest.qWait(1)等待直到没有按下muse按钮,然后执行SCI_GOTOLINE。“

在尝试了这两种方法之后,基于单发的解决方案发挥了魅力

挂接到已释放的指示器处理程序:

self.__editor.indicatorReleased.connect(self.__on_indicator_released)
相应的事件处理程序:

def __on_indicator_released(self, line_number, index, keys):
    QTimer.singleShot(50, lambda: self.__go_to_line(line_number))
调用SCI_GOTOLINE中的SCI_GOTOLINE API:

def __go_to_line(self, line_number):
    self.__editor.SendScintilla(QsciScintilla.SCI_GOTOLINE, line_number)
但是,基于鼠标状态的解决方案不起作用,因为鼠标按钮始终等于“Qt.NoButton”

mouse_state = QtCore.QCoreApplication.instance().mouseButtons()
while mouse_state != Qt.NoButton:
    mouse_state = QtCore.QCoreApplication.instance().mouseButtons()
    QTest.qWait(1)

提供一个解决问题的方法,我在下面发布了解决方案。但是,我将编辑原始问题并粘贴代码状态-在修复之前,您找到答案固然很好,但提供MRE也很好(对于将来的出版物),因为它可以帮助社区理解您的问题,从而更容易帮助您。当然。我完全同意你的看法。谢谢你的理解:)嗨@Rida,我很高兴Matic解决了你的问题。感谢您在此处发布解决方案,以便其他人可以从中受益:-)您和Matic展示了我们应该如何让其他人受益的伟大示例。你在以身作则