如何将QTableView的QAbstractItemModel转换为QStandardItemModel?
解决QAbstractItemModel转QStandardItemModel的问题
首先得明确一点:不能直接强制转换基类指针到子类指针(这就是你遇到invalid conversion错误的核心原因)。QAbstractItemModel是QStandardItemModel的基类,只有当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




