0

Python 2.5.4 PyQt4

QDoubleSpinBox をサブクラス化して、focusIn イベントでシグナルを発するようにしました。



#Custom widgets for DPL GUI
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class DPLDoubleSpinBox(QDoubleSpinBox):

    __pyqtSignals__ = ("valueChanged(double)", "focusIn()")

    def __init__(self, *args):
        QDoubleSpinBox.__init__(self, *args)

    def event(self, event):
        if(event.type()==QEvent.FocusIn):
            self.emit(SIGNAL("focusIn()"))
            #self.clear() Works as expected
            self.selectAll() #See below                  

        return QDoubleSpinBox.event(self, event)

if __name__ == "__main__":

    import sys

    app = QApplication(sys.argv)
    widget = DPLDoubleSpinBox()
    widget2 = DPLDoubleSpinBox()
    widget.show()
    widget2.show()
    sys.exit(app.exec_())

1 つのボックス内をクリックしてから、もう 1 つのウィンドウを強制終了すると、機能します。1 つをクリックしてからもう 1 つをクリックし、デスクトップ上の他のウィンドウにフォーカスすると、動作するようです。

フォーカスの問題だと思いますが、追跡できません。クリックしたときにすべてを選択するだけです。行編集ポインターを使用して実行しようとしましたが、同じ結果が得られます。他のウィジェットにフォーカスを強制しようとしましたが、それでも同じ結果です。

カスタム スロットを接続して、「focusIn()」を発行したときに起動することができます。その後、anyQSpinBox.selectAll() を実行できますが、それ自体では機能しません。

4

3 に答える 3

2

この質問が2年以上前のものであることは承知していますが、「qspinbox select on focus」をグーグルで検索したときの最初の結果の1つであるため、将来の世代のために解決策を残したいと思います.

問題は、QSpinBox.lineEdit() の動作です。focusInEvent で selectAll() を呼び出すことができますが、何らかの理由で QLineEdit の mousePressEvent が focus イベントの直後に選択をクリアします。説明については、こちらを参照してください。

解決策は、QSpinBox.lineEdit() ウィジェットまたはサブクラス QLineEdit のイベント フィルターをインストールして、QSpinBox.setLineEdit() を呼び出すことです。いずれにせよ、上記のリンクは、ブール値のフラグを保持し、focusInEvent と mousePressEvent の両方をフィルタリングすることで、目的の動作を実現する方法を示しています。

于 2012-02-02T10:26:35.280 に答える
0

イベントを変更しましたQEvent.Enter

今、それはself.selectAll()

これはタッチ スクリーン アプリケーション用であるため、これを回避できます。そのため、何かがおかしいことがユーザーには明らかではありません。何が欠けているのか、またはこれが単なるバグなのかどうかを知りたいです。

于 2009-12-13T19:35:58.153 に答える