1

を使用して の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)
4

1 に答える 1

1

同じ行内で新しい列が選択されても、何も起こりません。

これは、currentRowChangedシグナルを使用しているためです。同じ行の列を選択した場合、そのシグナルは発生しません。シグナルを使用する必要がありますcurrentChanged。(そして、新しいスタイルの接続を使用する必要があります)

QModelIndexまた、データだけを求めている場合は、非プロキシを取得してモデルに問い合わせるなどの必要はありません。Aには、この目的のためだけ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()) 
于 2012-09-25T11:30:03.387 に答える