PyQt6+QML TableView无法选中单元格/行且报错问题排查
PyQt6中QML TableView搭配QAbstractTableModel的选中问题
我在PyQt6中使用QML的TableView搭配QAbstractTableModel,参考Qt官方文档实现单元格(或行)选中功能以获取数据。表格数据显示正常,但无法选中任何内容,点击单元格时会触发一系列Qt信号断开错误:
qt.core.qobject.connect: QObject::disconnect: No such signal QObject::rowsAboutToBeRemoved(QModelIndex,int,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::columnsAboutToBeRemoved(QModelIndex,int,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::rowsAboutToBeInserted(QModelIndex,int,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::columnsAboutToBeInserted(QModelIndex,int,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::rowsMoved(QModelIndex,int,int,QModelIndex,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::columnsMoved(QModelIndex,int,int,QModelIndex,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::modelReset() qt.core.qobject.connect: QObject::disconnect: No such signal QObject::rowsAboutToBeRemoved(QModelIndex,int,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::columnsAboutToBeRemoved(QModelIndex,int,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::rowsAboutToBeInserted(QModelIndex,int,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::columnsAboutToBeInserted(QModelIndex,int,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::rowsMoved(QModelIndex,int,int,QModelIndex,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::columnsMoved(QModelIndex,int,int,QModelIndex,int) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint) qt.core.qobject.connect: QObject::disconnect: No such signal QObject::modelReset()
尝试在QML中用current替代selected实现了单个单元格选中及颜色变化,但错误仍存在,且无法实现整行选中。已在Windows(Qt6.2)和Linux(Qt6.4.1)环境测试,问题均存在。相关代码如下:
MyTableView.qml
import QtQuick import QtQuick.Controls TableView { id: tableView boundsBehavior: Flickable.StopAtBounds clip: true model: customTableModel onWidthChanged: tableView.forceLayout() selectionModel: ItemSelectionModel { onCurrentChanged: { console.log(currentIndex) // This works } } selectionBehavior: TableView.SelectRows columnWidthProvider: function (column) { return tableView.model ? tableView.width/tableView.model.columnCount() : 0 } delegate: Rectangle { required property bool selected required property bool current implicitWidth: tableView.columnWidthProvider(column) implicitHeight: 40 border.color: "black" border.width: 1 color: header ? "grey" : current ? "lightblue" : "white" clip: true Text { text: display anchors.centerIn: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.family: Style.font font.pointSize: Style.normalFont font.bold: header ? true : false color: header ? "white" : "black" } } }
table_model.py
class TableModel(QAbstractTableModel): def __init__(self, header, data, parent=None): super(TableModel, self).__init__(parent) self.header = header self.datatable = data self.datatable.insert(0, {h: h.replace("_", " ").capitalize() for h in header.values()}) def rowCount(self, parent=QModelIndex()): if parent == QModelIndex(): return len(self.datatable) if self.datatable else 0 return 0 def columnCount(self, parent=QModelIndex()): if parent == QModelIndex(): return len(self.header) return 0 def data(self, index, role=Qt.ItemDataRole.DisplayRole): if not index.isValid(): return None # Heading if role == Qt.ItemDataRole.UserRole + 1: return index.row() == 0 # Table Data if role == Qt.ItemDataRole.DisplayRole: row = index.row() col = index.column() data = self.datatable[row][self.header[col]] return str(data) if data else "" return None def roleNames(self): roles = { Qt.ItemDataRole.DisplayRole: b"display", Qt.ItemDataRole.UserRole + 1: b"header" } return roles def flags(self, index): print("flags sent") return Qt.ItemIsEnabled | Qt.ItemIsSelectable
内容的提问来源于stack exchange,提问作者Arsany Samuel
相关产品推荐
相关产品推荐

