17

非常に小さな問題:

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) でテストしました。

再現する手順:

  1. スクリプトを実行する
  2. マウス カーソルをテキスト領域に置くと、テキスト カーソルに変わります。
  3. F5 を押し、プログレス バーが消えるのを待ちます。マウスをテキスト領域の上に置いたままにすると、ポインターに変わります。

期待される結果: プログレス バーが消えると、カーソルはテキスト エリア上に移動したままで、テキスト カーソルに戻ります。

実際の結果: カーソルが移動してテキスト領域に戻るまで、カーソルはポインターのままです。

4

1 に答える 1

1

私はこれを回避することしかできませんでした(明らかにバグです):

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

面白いことに、setPos(0, 0)私のシステム (一部の Ubuntu) ではマウスを動かすことさえできないので、単に呼び出すと、マウスはそのままの位置に留まり、カーソルはわずかな動きでもすぐに元に戻ります (動かす必要はありません)。エディタから離れてください)。しかし、setPos()位置を元に戻す追加機能がうまく機能し、カーソルが即座に更新されます。これには追加のボーナスがあります。計算の進行中に移動すると、上記の回避策により、マウスカーソルが実際にある場所に適した形状にカーソルがリセットされます。

于 2015-05-02T08:10:05.743 に答える