开发者社区> 问答> 正文

在indicatorrelease()事件处理程序中执行Qscintilla的“SCI_GOTOLI

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

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)

问题来源StackOverflow 地址:/questions/59380763/executing-sci-gotoline-api-of-qscintilla-inside-indicatorreleased-event-hand

展开
收起
kun坤 2019-12-28 14:10:13 558 0
1 条回答
写回答
取消 提交回答
  • 我收到了来自@Matic Kukovec & @K的回复。Mulier在另一条线上。我把它贴在这里,这样其他人可以从中受益。 @Matic Kukovec回复我:“有两种解决方案:使用QTimer。在经过短暂的延迟(我使用50ms)后,在indicatorrelease事件中执行SCI_GOTOLINE,或者在indicatorrelease事件中使用:while mouse_state != data.Qt。NoButton: PyQt5.QTest.qWait(1)等待,直到没有muse按钮被按下,然后执行SCI_GOTOLINE。 在尝试了这两种方法之后,基于singleshot的解决方案产生了效果: 连接到一个indicator_release处理程序:

    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 in go_to_line API:

    def __go_to_line(self, line_number):
        self.__editor.SendScintilla(QsciScintilla.SCI_GOTOLINE, line_number)
    

    但是,基于mouse_state的解决方案不起作用,因为mouse_button始终等于“Qt.NoButton”。

    mouse_state = QtCore.QCoreApplication.instance().mouseButtons()
    while mouse_state != Qt.NoButton:
        mouse_state = QtCore.QCoreApplication.instance().mouseButtons()
        QTest.qWait(1)
    
    2019-12-28 14:10:22
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载