PyQt (или просто QT). Как заставить QComboBox запускать сигнал всякий раз, когда для него установлено значение (даже если оно не изменено) - PullRequest
7 голосов
/ 19 октября 2010

Я использую PyQt4, но этого достаточно, чтобы оно могло применяться только к QT.

У меня есть серия QComboBoxes, которую я заполняю слева направо (т. Е. Выбор элемента в крайнем левом углу заполнит следующий. Выбор элемента в этом заполнит следующий и т. Д.)

У меня возникают трудности с срабатыванием сигналов в любых ситуациях (т. Е. Независимо от того, изменяется текущий индекс или нет, И независимо от того, установлен элемент пользователем или установлен программно).

Подробнее:

Я полагаюсь на сигналы первого QCombox, чтобы сработать всякий раз, когда элемент выбран, чтобы я мог заполнить следующий QCombobox в графическом интерфейсе. Затем я полагаюсь на то, что QCombobox испускает сигнал, чтобы я мог заполнить следующий. И так далее.

Я хочу предварительно выбрать элемент в каждом QCombobox в зависимости от последнего взаимодействия пользователя с графическим интерфейсом.

У меня есть уникальная функция для QCombobox, которая отвечает за заполнение и предварительный выбор только этого QCombobox. Код выглядит примерно так:

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

где intLastSavedState1 - это целое число, полученное из текста, который последний раз выбирал пользователь во время последнего использования приложения. Я надеялся, что последняя строка этой функции выдаст сигнал, который заставит функцию следующего поля со списком загрузить и предварительно выбрать элемент (comboBox2). И тогда это действие вызовет активацию следующей функции comboBox's и будет каскадно переходить к следующему и следующему. Но это работает не во всех случаях.

Я пробовал две версии сигналов:

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), и поэтому сигнал не срабатывает.

Во втором случае сигнал сработает независимо от того, что в данный момент выбрано в поле со списком ... но только если он активирован пользователем. Он не сработает, когда мой скрипт попытается установить текущий индекс программно.

Похоже, это только мои два варианта в отношении сигналов. Итак ... есть ли другой способ предварительного выбора элементов в QCombobox, который будет вызывать сигнал каждый раз?

1 Ответ

8 голосов
/ 19 октября 2010

Ну ... иногда сам акт вопроса может привести к (частичному) ответу.

У меня есть обходной путь, но мне все еще интересно услышать, если у кого-то есть идея получше.

Сейчас я программно устанавливаю индекс 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.

...