Подтвердить что ты не робот

PyQt: Как reset курсор на все, что он витает над

Очень маленькая проблема:

Я написал небольшую среду IDE с виджем редактирования текста на основе QPlainTextEdit. Когда вы наводите курсор мыши, курсор становится курсором/текстовым курсором, как ожидалось. Если вы нажмете F5, окно будет отключено, и будет запущен небольшой script, после которого окно будет снова включено и текстовая область будет выделена.

Как-то это изменяет курсор от текстового курсора на указатель. Если вы переместите курсор из области текста, а затем вернитесь на него, он снова превратится в текстовый курсор.

Есть ли способ запустить это обновление программно?


Обновление: Кажется, что-то связано с наличием индикатора выполнения:

#!/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

Шаги для воспроизведения:

  • Запустите script
  • Поместите курсор мыши над текстовой областью, он должен превратиться в текстовый курсор
  • Нажмите F5, подождите, пока индикатор выполнения исчезнет, ​​оставьте курсор мыши над текстовой областью, он должен превратиться в указатель

Ожидаемый результат: После того, как индикатор прогресса уйдет, курсор, все еще зависающий над текстовой областью, должен вернуться к текстовому курсору

Фактический результат: курсор остается указателем, пока он не переместится и не вернется в текстовую область

4b9b3361

Ответ 1

Мне удалось обойти это (что, очевидно, ошибка):

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

Самое забавное: setPos(0, 0) в моей системе (некоторые Ubuntu) даже не перемещает мышь, поэтому, если я просто ее назову, мышь останется там, где она есть, и курсор изменится сразу после малейшего движения (не нужно больше удалять его из редактора). Но дополнительный setPos(), который возвращает позицию назад, делает трюк, и курсор обновляется мгновенно. У этого есть дополнительный бонус, который, если вы отпустите его, пока выполняется вычисление, обходной путь выше по-прежнему сбрасывает курсор на любую фигуру, подходящую для места, в котором находится курсор мыши.