qt cursor pyqt qplaintextedit

PyQt: cómo restablecer el cursor a lo que sea que se encuentre sobre



qplaintextedit (1)

Muy pequeño problema:

He escrito un IDE pequeño con un widget de edición de texto basado en un QPlainTextEdit. Cuando mueva el mouse sobre él, el cursor se convertirá en un cursor de intercalación / texto como se esperaba. Si pulsa F5, la ventana se desactiva y se ejecuta un pequeño script, después de lo cual se vuelve a habilitar la ventana y se enfoca el área de texto.

De alguna manera, esto cambia el cursor de un cursor de texto a un puntero. Si mueve el cursor fuera del área de texto y luego vuelve a él, se convierte nuevamente en un cursor de texto.

¿Hay alguna forma de activar esta acción de actualización mediante programación?

Actualización: parece tener algo que ver con tener una barra de progreso:

#!/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_())

Lo he probado en Linux (Fedora 21) con Python 2.7.8 y PyQt4 versión 4.8.6

Pasos para reproducir:

  1. Ejecuta el script
  2. Coloque el cursor del mouse sobre el área de texto, se debe convertir en un cursor de texto.
  3. Presione F5, espere a que la barra de progreso desaparezca, deje el mouse sobre el área de texto, se debería convertir en un puntero.

Resultado esperado: una vez que la barra de progreso desaparezca, el cursor, aún sobre el área de texto, debería volver a un cursor de texto

Resultado real: el cursor permanece como un puntero, hasta que se desplaza hacia atrás y vuelve al área de texto


Solo pude evitar esto (lo que obviamente es un error):

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

Lo gracioso es que setPos(0, 0) en mi sistema (algo de Ubuntu) ni siquiera mueve el mouse, así que si lo llamo, el mouse permanece donde está y el cursor vuelve a aparecer inmediatamente después de un movimiento mínimo. (no hay necesidad de alejarlo más del editor). Pero el setPos() adicional que revierte la posición hacia atrás hace el truco, y el cursor se actualiza instantáneamente. Esto tiene la ventaja adicional de que si lo aleja mientras el cálculo está en curso, la solución anterior aún restablece el cursor a la forma correcta para el lugar donde se encuentra el cursor del mouse.