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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:08