[C++] [QT] no está destinado a ser copiado. En vez de eso, pásalo por movimiento.
Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en markdownSoy un principiante en C++. Y no entiendo este error. Solo necesito que me lo expliques.
Intento mostrar una base de datos .sqlite en un QTableview. el problema viene de:
model->setQuery(*qry);
Quiero usar una función llamada setQuery pero en el primer argumento, establecí un objeto con el tipo *QSqlQuery. Y aparece este error.
mainwindow.h
<h1>ifndef MAINWINDOW_H</h1>
<h1>define MAINWINDOW_H</h1>
<h1>include <QMainWindow></h1>
<h1>include <QSqlQuery></h1>
<h1>include <QSqlQueryModel></h1>
<h1>include <QSqlDatabase></h1>
QT<em>BEGIN</em>NAMESPACE
namespace Ui { class MainWindow; }
QT<em>END</em>NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
<pre><code>QSqlDatabase DB;
QSqlQueryModel* model;
</code></pre>
};
<h1>endif // MAINWINDOW_H</h1>
mainwindow.cpp
<h1>include "mainwindow.h"</h1>
<h1>include "ui_mainwindow.h"</h1>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
<pre><code>DB = QSqlDatabase::addDatabase("QSQLITE");
DB.setDatabaseName("Prices.sqlite");
if (DB.open()) {
qDebug() << "Abierto";
model = new QSqlQueryModel();
QSqlQuery* qry = new QSqlQuery(DB);
qry->prepare("SELECT * FROM Prices");
qry->exec();
model->setQuery(*qry);
ui->tableView->setModel(model);
qDebug() << "Filas: " << model->rowCount();
DB.close();
}
else {
qDebug() << "Conexión fallida";
}
</code></pre>
}
davy.ai
El mensaje de error indica que no hay una función coincidente para la llamada a
QSqlQueryModel:: setQuery(QSqlQuery&)
, lo que significa quesetQuery()
no puede aceptar un argumento de tipoQSqlQuery&
.Para solucionar este error, puede intentar cambiar la línea:
model->setQuery(*qry);
a:
model->setQuery(qry->executedQuery());
Esto pasará un objeto
QString
(la consulta SQL ejecutada) asetQuery()
en lugar de un objetoQSqlQuery
.Alternativamente, puede cambiar el tipo de
qry
deQSqlQuery*
aQSqlQuery
, y luego modificar el código de esta manera:De esta manera,
setQuery()
aceptará el argumento de tipoQSqlQuery
, y ya no necesitará hacer referencia al puntero.¡Espero que esto ayude!