PyQt:如何将光标重置为悬停的位置

PyQt: How to reset the cursor to whatever it's hovering over

非常小的问题:

我写了一个小 IDE,带有基于 QPlainTextEdit 的文本编辑小部件。当您将鼠标移到它上面时,光标会按预期变为 caret/text 光标。如果您按 F5,window 将被禁用,然后运行一个小脚本,然后 window 将重新启用,文本区域将获得焦点。

不知何故,这将光标从文本光标更改为指针。如果将光标移出文本区域然后再移回文本区域,它将再次变成文本光标。

有什么方法可以通过编程方式触发此刷新操作吗?


更新:好像跟有进度条有关:

#!/usr/bin/env python
import sys
import time
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt

class TinyIDE(QtGui.QMainWindow):

    def __init__(self, filename=None):
        super(TinyIDE, self).__init__()
        self.setWindowTitle('Tiny IDE test')

        # Add menu item
        menu = self.menuBar()
        menu_run = menu.addMenu('&Run')
        tool_run = QtGui.QAction('&Run', self)
        tool_run.setShortcut('F5')
        tool_run.triggered.connect(self.action_run)
        menu_run.addAction(tool_run)

        # Add editor
        self._editor = QtGui.QPlainTextEdit()
        self._editor.setPlainText('Press F5 to run')
        self.setCentralWidget(self._editor)
        self._editor.setFocus()

    def action_run(self):
        pbar = None
        try:
            self.setEnabled(False)

            pbar = QtGui.QProgressDialog('Running script', 'Cancel', 0, 10)
            pbar.setWindowModality(Qt.WindowModal)
            pbar.setAutoClose(False)
            pbar.setAutoReset(False)
            pbar.show()

            for i in xrange(10):
                time.sleep(0.2)
                pbar.setValue(1 + i)
                QtGui.QApplication.processEvents()

        finally:

            QtGui.QApplication.processEvents()
            pbar.close()
            pbar.deleteLater()
            self.setEnabled(True)
            self._editor.setFocus()

if __name__ == '__main__':
    a = QtGui.QApplication([])
    a.connect(a, QtCore.SIGNAL('lastWindowClosed()'), a, QtCore.SLOT('quit()'))
    w = TinyIDE()
    w.show()
    sys.exit(a.exec_())

我已经在 Linux (Fedora 21) 上使用 Python 2.7.8 和 PyQt4 版本 4.8.6

对其进行了测试

重现步骤:

  1. 运行 脚本
  2. 将鼠标光标放在文本区域上,它应该变成文本光标
  3. 按F5,等待进度条消失,将鼠标悬停在文本区域,它应该变成一个指针

预期结果:一旦进度条消失,仍然悬停在文本区域上的光标应该恢复为文本光标

实际结果:光标保持指针状态,直到它离开并返回到文本区域

我只能解决这个问题(这显然是一个错误):

        pos = QtGui.QCursor.pos()
        QtGui.QCursor.setPos(0, 0)
        QtGui.QCursor.setPos(pos)

有趣的是,setPos(0, 0) 在我的系统上(有些 Ubuntu)甚至不移动鼠标,所以如果我只是调用它,鼠标会停留在原处,而光标即使是最轻微的移动也会立即变回(不再需要将其从编辑器中移开)。但是将位置恢复原状的附加 setPos() 可以解决问题,并且光标会立即更新。这有一个额外的好处,如果你在计算过程中将它移开,上面的解决方法仍然会将光标重置为鼠标光标实际所在位置的正确形状。