[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);
我是 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);