Текст выбранного элемента PyQt4 в QTableView задерживается на один клик

Я использую QTableView для отображения содержимого QSqlTableModel вместе с QSortFilterProxyModel для фильтрации записей. В следующем коде мне удалось отобразить выделенный текст, когда пользователь щелкает ячейку (независимо от того, применен фильтр или нет). Однако всегда отстает на 1 щелчок, первый щелчок после запуска вызывает IndexError: pop from empty list, и когда в той же строке выбирается новый столбец, ничего не происходит.

Я попытался выбрать индекс после инициализации таблицы, но, похоже, ничего не сделал. У меня нет идей, что попробовать дальше?

class TableViewer(QtGui.QWidget):

    self.model =  QSqlTableModel()
    self._proxyModel = QtGui.QSortFilterProxyModel()
    self._proxyModel.setSourceModel(self.model)

    self.tv= QTableView()
    self.tv.setModel(self._proxyModel)

   '''Call-able filter - pass in string to filter everything that doesn't match string'''
    QtCore.QObject.connect(self.textEditFilterBox,  QtCore.SIGNAL("textChanged(QString)"),     self._proxyModel.setFilterRegExp)


     def getItem(self):
         '''Retruns item text of selected item'''
         index = self.selectionModel.selectedIndexes().pop()
         if index.isValid():
             row = index.row()
             column = index.column()
             model = index.model()
             if hasattr(model, 'mapToSource'):
                 #proxy model
                 modelIndex = model.mapToSource(index)
                 print (modelIndex.row(), modelIndex.column())
                 return self.model.record(modelIndex.row()).field(modelIndex.column()).value().toString()
         return self.model.record(row).field(column).value().toString()

class MainWindow(QtGui.QMainWindow):

    #initialize TableViewer

    self.tblViewer.connect(self.tblViewer.tv.selectionModel(),
            SIGNAL(("currentRowChanged(QModelIndex,QModelIndex)")),
            self.tblItemChanged)

    def tblItemChanged(self, index):
        '''display text of selected item '''
        text = self.tblViewer.getItem()
        print(text)

person Steve Lee    schedule 25.09.2012    source источник


Ответы (1)


и когда в той же строке выбирается новый столбец, ничего не происходит.

Это потому, что вы используете сигнал currentRowChanged. Этот сигнал не будет запущен, если вы выберете столбец в той же строке. Вы должны использовать сигнал currentChanged. (и вам следует использовать подключения нового стиля)

И, если вам нужны только данные, вам не нужны эти вещи, чтобы получить QModelIndex без прокси, а затем запросить модель и т. д. QModelIndex имеет удобный метод .data как раз для этой цели. Кроме того, сигнал будет присылать вам выбранный индекс, для этого не нужно никаких дополнительных действий. Это делает ваш код таким же простым: (примечание: метод getItem не нужен)

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        #initialize TableViewer
        self.tblViewer.tv.selectionModel().currentChanged.connect(self.tblItemChanged)

    def tblItemChanged(self, current, previous):
        '''display text of selected item '''
        # `data` defaults to DisplayRole, e.g. the text that is displayed
        print(current.data().toString()) 
person Avaris    schedule 25.09.2012
comment
Гораздо проще и работает отлично, спасибо. (Я не знал о новом стиле, он выглядит чище, еще раз спасибо.) - person Steve Lee; 26.09.2012