PyQt: как сбросить курсор на то, над чем он завис
Очень маленькая проблема:
Я написал небольшую IDE с виджетом для редактирования текста на основе QPlainTextEdit. Когда вы наводите курсор мыши на него, курсор становится курсором / текстовым курсором, как и ожидалось. Если вы нажмете 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
Действия по воспроизведению:
- Запустить скрипт
- Поместите курсор мыши над текстовой областью, он должен превратиться в текстовый курсор
- Нажмите F5, подождите, пока индикатор выполнения не исчезнет, оставьте указатель мыши над текстовой областью, он должен превратиться в указатель
Ожидаемый результат: как только индикатор выполнения исчезнет, курсор, все еще находящийся над текстовой областью, должен вернуться к текстовому курсору.
Фактический результат: курсор остается указателем, пока не будет перемещен и снова включен в текстовую область
1 ответ
Я мог только обойти это (что, очевидно, ошибка):
pos = QtGui.QCursor.pos()
QtGui.QCursor.setPos(0, 0)
QtGui.QCursor.setPos(pos)
Самое смешное, setPos(0, 0)
в моей системе (некоторые Ubuntu) даже не перемещает мышь, поэтому, если я просто назову ее, мышь останется на месте, и курсор вернется обратно сразу после даже малейшего движения (нет необходимости перемещать его из редактора. Больше). Но дополнительный setPos()
это возвращает позицию назад, и курсор обновляется мгновенно. Это дает дополнительный бонус, заключающийся в том, что если вы уберете его во время вычислений, обходной путь выше все равно сбрасывает курсор в любую форму, правильную для места, в котором фактически находится курсор мыши.