[C++][ QT ] 不是用来复制的。改为通过 move 传递

[C++][ QT ] is not meant to be copied. Pass it by move instead

我是 C++ 的初学者。我不明白这个错误。我只需要你解释一下。

我尝试在 QTableview 中显示 .sqlite 数据库。问题来自:

model->setQuery(*qry);

我想使用一个名为 setQuery 的函数,但在第一个参数中,我设置了一个 *QSqlQuery 类型的对象。出现此错误。

ERROR Pics

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlDatabase>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    QSqlDatabase DB;
    QSqlQueryModel* model;

};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;

    DB = QSqlDatabase::addDatabase("QSQLITE");
    DB.setDatabaseName("Prices.sqlite");

    if (DB.open()) {
        qDebug() << "Open";

        model = new QSqlQueryModel();

        QSqlQuery* qry = new QSqlQuery(DB);
        qry->prepare("SELECT * FROM Prices");
        qry->exec();

        model->setQuery(*qry);
        ui->tableView->setModel(model);

        qDebug() << "Rows: " << model->rowCount();

        DB.close();
    }
    else {
        qDebug() << "Failed connection";
    }
}


他们要你把qry后面的对象移到函数中。

最短的更改是替换

model->setQuery(*qry);

model->setQuery(std::move(*qry));
delete qry;

虽然在这种情况下您不需要使用 new/delete。仅使用自动存储期限有效:

    QSqlQuery qry(DB);
    qry.prepare("SELECT * FROM Prices");
    qry.exec();
    model->setQuery(std::move(qry));

那就不用担心忘记删除了

或者,由于 QSqlQuery 对象未在其他任何地方使用,因此最好为 setQuery 选择其他重载,如下所示:

model = new QSqlQueryModel();
model->setQuery("SELECT * FROM Prices", DB);
ui->tableView->setModel(model);