QListView
наследуется от QAbstractItemView
(я думаю, вы это знали), поэтому он получает несколько сигналов, надеюсь, один (или несколько) из них сработает для вас.
Это работает для меня (подключите сигналы при инициализации вашего QMainWindow
или основного QWidget
, как в примере SaltyCrane):
connect(your_list_view, SIGNAL("clicked(const QModelIndex&)"), handler_slot)
...
def handler_slot(idx):
#idx is a QModelIndex
#QModelIndex.data() returns a QVariant, Qt4's generic data container
celldata = idx.data()
#Choose the proper datatype to ask the QVariant for (e.g. QVariant.toInt())
actualvalue = celldata.toInt()
#QVariant.toInt() happens to return a tuple
print actualvalue[0]
В зависимости от типа данных в вашей модели вам потребуется выберите правильный тип данных, который нужно запросить у QVariant
.
Подлая часть здесь заключается в том, чтобы QListView
сообщал вам, какая ячейка была нажата (например, с использованием clicked(const QModelIndex&)
против clicked()
). Думаю, я потратил некоторое время на изучение документации C ++ для Qt4, прежде чем понял, что вы можете получить больше от сигналов.
Отсюда у меня будет handler_slot()
вызов setData()
метода модели для вашего второго QListView
(с использованием данных, сгенерированных функцией, которую вы изначально планировали использовать).
Я был бы рад уточнить, если бы не ответил на ваш вопрос.
Изменить: работа с клавишами со стрелками
Хм, кажется странным, что нет QListView
сигнала по умолчанию для движения стрелы, но мы можем сделать свой собственный.
(Это почти кажется неуместным для сигналов и режимов работы слотов Qt4)
QListView
повторно реализует метод keyPressEvent(self, QKeyEvent)
, который действует как функция обратного вызова при нажатии определенных клавиш. Подробнее… Мы можем использовать это, чтобы получить нужное ключевое событие (я) и испустить собственный сигнал.
class ArrowableListView(QListView):
def keyPressEvent(self, keyevent):
#Maintain original functionality by calling QListView's version
QListView.keyPressEvent(self, keyevent)
#QListView.selectedIndexes returns a list of selected cells, I'm just taking the first one here
idx = self.selectedIndexes()[0]
#We'll emit a signal that you can connect to your custom handler
self.emit(SIGNAL("my_signal"), idx)
Как только происходит нажатие клавиши, мы спрашиваем QListView
, каковы выбранные индексы (!). Конечно, вы можете выбрать отфильтровать определенные ключи и выберите, следует ли обрабатывать несколько выбранных ячеек (я думаю, вы можете установить режим выбора, когда это невозможно, см. QListView
документацию).
Теперь, когда у нас есть выбранные индексы (список QModelIndex
), мы передаем первый (QModelIndex
) вместе с нашим сигналом. Поскольку мы определяем этот сигнал в python, нам не нужно устанавливать прототип функции; Понятия не имею, плохой ли это стиль.
Теперь все, что вам нужно сделать, это подключить сигнал к обработчику:
self.connect(your_list_view, SIGNAL("my_signal"), handler_slot)
и напишите свой обработчик.
Надеюсь, это не слишком неприятный способ обхода.
person
anrope
schedule
25.09.2011
selectionModel
- person Kaleb Pederson   schedule 29.09.2011