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:
- Ejecuta el script
- Coloque el cursor del mouse sobre el área de texto, se debe convertir en un cursor de texto.
- 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.