Создайте сигнал для каждого элемента в QListWidget

Я хочу создать список элементов с помощью QListWidget и настроить его так, чтобы каждый раз, когда я нажимаю (выбираю) элемент, выполнялся другой метод. Я думал о том, как решить эту проблему, подключив список к методу, который будет проверять индекс, и в зависимости от индекса элемента он будет генерировать сигнал, связанный с другим методом. Дело в том, что я не знаю, как генерировать этот сигнал, если у меня нет кнопки или чего-то еще. Метод просто проверяет индекс элемента.

Любые предложения будут высоко оценены!


person theCHemist90    schedule 28.07.2015    source источник
comment
Зачем тебе сигнал? Почему бы просто не вызвать метод напрямую?   -  person ekhumoro    schedule 29.07.2015
comment
У вас уже есть набор сигналов, когда вы выбираете, щелкаете или дважды щелкаете по элементу: itemSelectionChanged, itemActivated, itemClicked... См. Документ Qt   -  person Mel    schedule 29.07.2015
comment
Можете ли вы уточнить? @эхуморо   -  person theCHemist90    schedule 29.07.2015


Ответы (1)


Простая идея состояла бы в том, чтобы подключить сигнал itemClicked к слоту, в котором метод вызывается в зависимости от индекса, по которому щелкнули. В этом случае вам не нужен сигнал для каждого элемента.

Но если вы действительно хотите создать сигнал «щелкнули» для каждого элемента и подключить его к соответствующему слоту (слотам), вы можете сделать это следующим образом:

  1. Подкласс QListWidgetItem и добавьте к нему сигнал clicked. Как добавить собственные сигналы

  2. При заполнении QListWidget соедините каждый элемент со своими слотами в зависимости от его индекса.

  3. Подключите сигнал itemClicked QListWidget к слоту, который излучает сигнал элемента, на который нажали, следующим образом:

    def itemClickedSlot(item):  
        item.clicked.emit()
    
person x squared    schedule 29.07.2015
comment
Спасибо. Я попробую это сделать. ekhumoro говорит, что я могу вызвать метод напрямую. Вы знаете, что он имеет в виду? - person theCHemist90; 29.07.2015
comment
Насколько я понимаю его комментарий, я бы сказал, что это первая альтернатива, которую я вам объяснил: вместо того, чтобы иметь сигнал для каждого элемента, просто вызывайте метод напрямую в зависимости от щелкнутого индекса. - person x squared; 29.07.2015
comment
Спасибо, х в квадрате. Я пытался заставить ваш ответ работать, но я не знал, как добавить сигнал щелчка к каждому элементу списка (он говорит, что QListWidgetItem не обладает этим атрибутом). После многих попыток я в итоге использовал сигнал currentRowChanged класса QListWidget и подключил его к методу, который вызывает определенную функцию на основе индекса. Это очень похоже на то, что вы упомянули. Так что, конечно, вы поставили меня на правильный путь. Спасибо еще раз! - person theCHemist90; 29.07.2015
comment
Я думаю, вы допустили ошибку на шаге 1. Вы создали подкласс QListWidgetItem, затем определили в нем сигнал clicked, а затем добавили экземпляры подкласса вместо базового класса в свой QListWidget? См. здесь, чтобы узнать как добавить пользовательский сигнал в ваш подкласс. - person x squared; 29.07.2015
comment
@theCHEmist90. Как я предположил, x в квадрате, я имел в виду, что вы должны сделать одно подключение к сигналу itemClicked виджета-списка, который затем отправит элемент, по которому щелкнули. Затем вы можете сделать listwidget.row(item), чтобы получить индекс и вызвать соответствующий метод. - person ekhumoro; 30.07.2015
comment
@xsquared. Спасибо. Да, я имел в виду, что не мог заставить это работать, потому что я не знал, как это сделать. - person theCHemist90; 30.07.2015
comment
@ehumoro. Благодарю вас! - person theCHemist90; 30.07.2015