非常に小さな問題:
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_())
Python 2.7.8 および PyQt4 バージョン 4.8.6 を使用して Linux (Fedora 21) でテストしました。
再現する手順:
- スクリプトを実行する
- マウス カーソルをテキスト領域に置くと、テキスト カーソルに変わります。
- F5 を押し、プログレス バーが消えるのを待ちます。マウスをテキスト領域の上に置いたままにすると、ポインターに変わります。
期待される結果: プログレス バーが消えると、カーソルはテキスト エリア上に移動したままで、テキスト カーソルに戻ります。
実際の結果: カーソルが移動してテキスト領域に戻るまで、カーソルはポインターのままです。