非常小的问题:
我已经编写了一个带有基于QPlainTextEdit的文本编辑小部件的小型IDE。当您将鼠标移到它上面时,光标将按预期变为插入/文本光标。如果按F5键,则会禁用该窗口并运行一个小脚本,然后重新启用该窗口并为文本区域提供焦点。
不知何故,这会将光标从文本光标更改为指针。如果将光标移出文本区域然后再移回文本区域,则会再次变为文本光标。
有没有办法以编程方式触发此刷新操作?
更新:这似乎与进度条有关:
#!/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进行了测试
重现的步骤:
预期结果:一旦进度条消失,仍然悬停在文本区域上方的光标应恢复为文本光标
实际结果:光标保持指针,直到它移开并重新回到文本区域
答案 0 :(得分:1)
我只能解决这个问题(这显然是一个错误):
pos = QtGui.QCursor.pos()
QtGui.QCursor.setPos(0, 0)
QtGui.QCursor.setPos(pos)
有趣的是,setPos(0, 0)
在我的系统上(某些Ubuntu)甚至没有移动鼠标,所以如果我只是调用它,鼠标就会停留在原来的位置,光标会立即变回最轻微的动作(无需再将其从编辑器中移开)。但是恢复位置的附加setPos()
可以解决问题,并且光标会立即更新。这有额外的好处,如果你在计算过程中将它移开,上面的解决方法仍然会将光标重置为鼠标光标实际所在位置的任何形状。