5

PyQt4 / Python3 GUIにいくつかのQComboBoxがあり、初期化中にデータベースからのいくつかのエントリで埋められます。初期CurrentIndexは0に設定されています。コンボボックス内の項目の言語を変更するチェックボックスもあります。現在のユーザー選択を保持するために、現在のアイテムのインデックスをバックアップし、ComboBoxに翻訳されたアイテムを入力した後、CurrentIndexをこの番号に設定します。これらのアクションはすべて、currentIndexChangedシグナルを発行します。

QComboBoxesで選択された項目に基づいて、いくつかのプロットが表示されます。アイデアは、ユーザーがComboBoxの現在のアイテムのいずれかを変更するとすぐに、プロットをオンラインで再描画することです。そして、ここで問題があります。シグナルcurrentIndexChangedが発行されるたびにプロットを再描画すると、初期化中に何度か再描画し、変換チェックボックスの選択が変更された場合です。

これらのケースを分離するための最良の方法は何ですか?原則として、プログラムによる現在のインデックス変更をユーザーから分離し、後者の場合にのみプロットを更新する必要があります(GUIの初期化中に、プログラムでプロット更新関数を1回呼び出すことができます)。信号を書き込んだり書き直したりする必要がありますか?もしそうなら、私は以前にそれをしたことがなく、ヒントや良い例を歓迎します。別の信号を使用しますか?または、すべての信号を一時的にブロックする方法はありますか?

4

1 に答える 1

11

あなたが試すことができるいくつかの異なることがあります。

まず、信号を接続する前に、すべての初期化を行っていることを確認できます。

次に、ユーザーがアイテムを選択するたびにのみ送信されるアクティブ化されたシグナルを使用できます。(ただし、currentIndexChangedとは異なり、このシグナルはインデックスが変更されていない場合でも送信されることに注意してください)。

第3に、 blockSignalsを使用して、現在のインデックスがプログラムで変更されている間、送信される信号を一時的に停止できます。

これらの可能性を示すスクリプトは次のとおりです。

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QVBoxLayout(self)
        self.combo = QtGui.QComboBox()
        self.combo.setEditable(True)
        self.combo.addItems('One Two Three Four Five'.split())
        self.buttonOne = QtGui.QPushButton('Change (Default)', self)
        self.buttonOne.clicked.connect(self.handleButtonOne)
        self.buttonTwo = QtGui.QPushButton('Change (Blocked)', self)
        self.buttonTwo.clicked.connect(self.handleButtonTwo)
        layout.addWidget(self.combo)
        layout.addWidget(self.buttonOne)
        layout.addWidget(self.buttonTwo)
        self.changeIndex()
        self.combo.activated['QString'].connect(self.handleActivated)
        self.combo.currentIndexChanged['QString'].connect(self.handleChanged)
        self.changeIndex()

    def handleButtonOne(self):
        self.changeIndex()

    def handleButtonTwo(self):
        self.combo.blockSignals(True)
        self.changeIndex()
        self.combo.blockSignals(False)

    def changeIndex(self):
        index = self.combo.currentIndex()
        if index < self.combo.count() - 1:
            self.combo.setCurrentIndex(index + 1)
        else:
            self.combo.setCurrentIndex(0)

    def handleActivated(self, text):
        print('handleActivated: %s' % text)

    def handleChanged(self, text):
        print('handleChanged: %s' % text)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
于 2012-02-08T19:40:35.777 に答える