2012-02-08 13 views
3

私は私PyQt4 /のpython3 GUIでいくつかのQComboBoxesを持っており、それらが初期化中に、データベースからいくつかのエントリで満たされています。初期CurrentIndexは0に設定されています。また、コンボボックス内の項目の言語を変更するチェックボックスがあります。現在のユーザー選択を保持するために、私は現在のアイテムのインデックスをバックアップし、翻訳されたアイテムでComboBoxを埋めた後にsetCurrentIndexをこの番号にバックアップします。これらのすべてのアクションは、currentIndexChangedシグナルを送出します。いくつかのプロットが表示されているQComboBoxesで選択した項目に基づいて別のユーザーとの対話:PyQtは、QComboBox

。ユーザーがComboBoxの現在のアイテムを変更するとすぐに、プロットをオンラインで再描画することが考えられます。そして、ここで私は、プロットを再描画場合currentIndexChangedたびに信号がemitedされ、私は初期化中に、翻訳のチェックボックスの選択が変更された場合も、数回それを再描画しますので、問題を抱えています。

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

答えて

9

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

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

第2に、ユーザがアイテムを選択するたびに送信されるactivated信号を使用できます。 (ただし、currentIndexChangedとは異なり、インデックスが変更されていなくてもこの信号が送信されます)。

第三に、あなたは一時的に、現在のインデックスがプログラムで変更されている間、送信されている任意の信号を停止する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_()) 
+0

ありがとう!私はblockSignalsソリューションを利用しました。実際には、QTデザイナーを使用していて、例のようにプログラムレイアウトを使用していないと、実際に "信号を接続する前にすべての初期化を行う"ことが可能ですか?どの時点で信号が有効になりますか? – Katya

+0

@Katya。 Qt Designerでは、既存の信号を既存のスロットに接続することができます(自分のハンドラとは対照的に)。したがって、実際には、アプリケーションが非常にシンプルでない限り、ほぼすべての信号がGUIに接続されている必要があります。個人的には、私はguiをレイアウトするためにQt Designerを使用し、シグナルを接続するのはごく稀です。 – ekhumoro

関連する問題