C++ Qt调用QSqlQueryModel::setQuery提示不可复制报错求助
报错根因
你碰到的报错是Qt6对QSqlQuery的语义限制导致的:
QSqlQuery类的拷贝构造函数被显式删除,不允许拷贝操作- Qt6中
QSqlQueryModel::setQuery(const QSqlQuery &query)这个重载已经被废弃,替换为setQuery(QSqlQuery &&query),要求参数是可移动的右值 - 你代码里
model->setQuery(*qry)是把堆上的QSqlQuery对象作为左值传入,触发了被禁用的拷贝逻辑,因此报出要求你用move传递的错误。
你代码还存在的其他逻辑错误
你把数据库连接、查询、绑定UI的逻辑全部写在了MainWindow的析构函数里,只有窗口销毁的时候才会执行这部分逻辑,完全不符合预期,这部分逻辑要移到构造函数中执行。
另外你直接new QSqlQuery、new QSqlQueryModel不指定父对象也不手动释放,会造成内存泄漏。
修复代码
修正后的mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QSqlError> #include <QDebug> #include <utility> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); DB = QSqlDatabase::addDatabase("QSQLITE"); DB.setDatabaseName("Prices.sqlite"); if (DB.open()) { qDebug() << "数据库打开成功"; model = new QSqlQueryModel(this); // 指定父对象,自动回收内存 // 方案1:直接使用SQL字符串重载,无需手动构造QSqlQuery(更简单) model->setQuery("SELECT * FROM Prices", DB); // 方案2:如果需要手动构造QSqlQuery,用std::move转移所有权 // QSqlQuery qry(DB); // qry.prepare("SELECT * FROM Prices"); // qry.exec(); // model->setQuery(std::move(qry)); ui->tableView->setModel(model); qDebug() << "查询到行数: " << model->rowCount(); } else { qDebug() << "数据库连接失败:" << DB.lastError().text(); } } MainWindow::~MainWindow() { delete ui; if (DB.isOpen()) { DB.close(); } }
内容的提问来源于stack exchange,提问作者thacaout
相关产品推荐
相关产品推荐

