You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将QTableView的QAbstractItemModel转换为QStandardItemModel?

解决QAbstractItemModel转QStandardItemModel的问题

首先得明确一点:不能直接强制转换基类指针到子类指针(这就是你遇到invalid conversion错误的核心原因)。QAbstractItemModelQStandardItemModel的基类,只有当QTableView->model()返回的对象实际就是QStandardItemModel的实例时,才能安全转换;如果不是,就只能手动把数据复制到新的QStandardItemModel实例中。

情况1:源Model本来就是QStandardItemModel

如果你的QTableView一开始就是用QStandardItemModel作为数据模型的,那可以用Qt的qobject_cast做安全转换——它会在类型不匹配时返回nullptr,避免程序崩溃:

QAbstractItemModel* sourceModel = ui->tableView->model();
QStandardItemModel* standardModel = qobject_cast<QStandardItemModel*>(sourceModel);

if (standardModel) {
    // 现在可以安全调用clear()等QStandardItemModel专属方法了
    standardModel->clear();
} else {
    // 转换失败,说明源Model不是QStandardItemModel类型
    qWarning() << "Source model is not a QStandardItemModel!";
}

情况2:源Model是其他QAbstractItemModel子类

如果源Model是自定义模型或者Qt内置的其他模型(比如QSqlTableModel),那只能手动遍历源模型的数据,把内容复制到新的QStandardItemModel里:

QAbstractItemModel* sourceModel = ui->tableView->model();
QStandardItemModel* newStandardModel = new QStandardItemModel();

// 复制表头信息
newStandardModel->setHorizontalHeaderLabels(sourceModel->headerData(Qt::Horizontal, Qt::DisplayRole).toStringList());
newStandardModel->setVerticalHeaderLabels(sourceModel->headerData(Qt::Vertical, Qt::DisplayRole).toStringList());

// 逐行逐列复制数据(还可按需复制对齐方式、颜色等其他角色数据)
for (int row = 0; row < sourceModel->rowCount(); ++row) {
    QList<QStandardItem*> itemRow;
    for (int col = 0; col < sourceModel->columnCount(); ++col) {
        QModelIndex index = sourceModel->index(row, col);
        QStandardItem* item = new QStandardItem(sourceModel->data(index, Qt::DisplayRole).toString());
        // 示例:复制文本对齐方式
        item->setData(sourceModel->data(index, Qt::TextAlignmentRole), Qt::TextAlignmentRole);
        itemRow.append(item);
    }
    newStandardModel->appendRow(itemRow);
}

// 现在newStandardModel就包含了源模型的数据,可自由调用clear()等方法
// 注意:使用完毕后要妥善管理内存,避免泄漏

内容的提问来源于stack exchange,提问作者user4266493

火山引擎 最新活动