1

入力マスクを使用して 6 つの数字を入力するために QLineEdit を使用しようとしていますが、問題は、ユーザーが行編集をクリックすると、カーソル位置がクリックした場所とまったく同じになることです。

位置を最初にリセットするのに苦労しています。同様の質問とそれらへの回答を読みましたが、機能させることができません(それらの多くはC ++であり、経験がないため、Pythonでコードを複製することはできません)。

ユーザーが QLineEdit をクリックしたことを認識するイベント フィルターをインストールすることができ、ユーザーがクリックしたときに設定したカーソル位置を印刷することができました。しかし、手動で 0 に設定しようとしても機能しません。まあ、それは機能しますが、QLineEdit を含むアプリケーション全体がフォーカスを失い、ユーザーが戻ってきた場合に限ります。ある意味では、 Filter クラス内でアプリケーション全体を更新/再描画する方法を探しています。

class Filter(QObject):
    def eventFilter(self, widget, event):
        # FocusIn event
        if event.type() == QEvent.FocusIn:
            print 'focus in'
            widget.setCursorPosition(0)
            return False

        else:
            return False

これによりカーソル位置が 0 に設定されますが、実際のアプリケーションでは、Alt+Tab キーを押すか、ウィンドウ全体がフォーカスを失い、再びフォーカスを得た場合にのみ表示されます。ウィジェット/ウィンドウの手動 repaint()/update() は何もしません。

4

1 に答える 1

0

行編集が空の場合、正しい動作は常にカーソルを先頭に置くことだと思います。それ以外の場合は、ユーザーがクリックした場所に移動する必要があります。おそらく、その位置の特定の文字を編集したいからです。

これを実装する簡単なデモを次に示します。

import sys
from PySide import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QtGui.QVBoxLayout(self)
        while layout.count() < 2:
            edit = QtGui.QLineEdit(self)
            edit.setInputMask('999999')
            edit.installEventFilter(self)
            layout.addWidget(edit)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            if not len(source.text()):
                source.home(False)
                return True
        return super(Window, self).eventFilter(source, event)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
于 2016-11-04T17:31:00.250 に答える