8

私はを使用してPyQt4いますが、これは一般的であるため、に適用できますQT

QComboBoxes左から右に入力する一連の項目があります(つまり、左端の項目を選択すると次の項目が入力されます。その項目で項目を選択すると次の項目が入力されます)。

すべての状況で(つまり、現在のインデックスが変更されているかどうかに関係なく、またアイテムがユーザーによって設定されているかプログラムで設定されているかに関係なく)シグナルを起動するのに問題があります。

より詳しく:

QComboxアイテムが選択されるたびに最初に発火する信号に依存してQCombobox、GUIで次のアイテムを入力できるようにします。次に、それを使用しQComboboxて信号を送信し、次の信号を入力できるようにします。等々。

QComboboxユーザーのGUIとの最後の対話に基づいて、それぞれの項目を事前に選択したいと思います。

QCombobox私には、そのデータの入力と事前選択を担当する独自の関数がありQComboboxます。コードは次のようになります。

comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)

ここintLastSavedState1で、は、ユーザーがアプリを最後に使用したときにユーザーが最後に選択したテキストから派生した整数です。この関数の最後の行が信号を発して、次のコンボボックスの関数がアイテムをロードして事前に選択するようになることを期待していました(comboBox2)。そして、そのアクションにより、次のcomboBox's関数がアクティブになり、次の関数と次の関数にカスケードされます。ただし、すべてのケースで機能しているわけではありません。

私は信号の2つのバージョンを試しました:

self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)

self.connect(comboBox1, QtCore.SIGNAL("activated(const QString&)"), self.load_comboBox2)

intLastSavedState1最初のケースでは、信号は、コンボボックスで現在選択されているものと異なる場合にのみ発火します。これにより、ユーザーがそのリストからアイテム0を最後に選択した場合に問題が発生します。この場合QT、現在のインデックスを0に設定しているスクリプトが変更であると認識しないため(ボックスをロードした後、すでにインデックス0にあると思われるため)、信号は起動しません。

2番目のケースでは、コンボボックスで現在選択されているものに関係なく、信号が発火します...ただし、ユーザーがアクティブにした場合に限ります。スクリプトが現在のインデックスをプログラムで設定しようとしても起動しません。

これらは、信号に関する私の唯一の2つのオプションのようです。QComboboxだから...毎回信号をトリガーするアイテムを事前に選択する別の方法はありますか?

4

2 に答える 2

10

ええと...時々、質問をするだけで(部分的な)答えにつながることがあります。

私には回避策がありますが、誰かがより良いアイデアを持っているかどうかを聞くことにまだ興味があります。

QComboboxロードした-1直後に、プログラムでのインデックスを設定しています。次に、ユーザーの履歴に基づいて実際のインデックスをプログラムで設定すると、それは常に変更と見なされ(つまり、-1になることはありません)、シグナルが発火します。

使用:currentIndexChanged(const QString&)

したがって、私のコードは次のようになります。

comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.setCurrentIndex(-1)
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)

私の信号は次のようになります。

self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)

この機能...誰かがより良いアイデアを持っていますか?

agianに感謝します。

于 2010-10-19T03:29:52.493 に答える
0

ComboBoxの現在のインデックスを確認してから、スロットを呼び出すか、setCurrentIndex()を呼び出すことができます。

例:

if comboBox1.currentIndex() == index:
    self.load_comboBox2(index)
else
    comboBox1.setCurrentIndex(index)

このようにして、スロットを2回呼び出すことはありません。

于 2020-07-12T11:42:30.690 に答える