You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:21:00