#c #qt #qt6
#c #qt #qt6
Вопрос:
Я новичок в C . И я не понимаю этой ошибки. Мне просто нужно, чтобы ты объяснил мне.
Я пытаюсь показать базу данных .sqlite в QTableView. Проблема исходит от:
model-gt;setQuery(*qry);
Я хочу использовать функцию setQuery, но в первом аргументе я задаю объект с типом *QSqlQuery. И эта ошибка появляется.
главное окно.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include lt;QMainWindowgt; #include lt;QSqlQuerygt; #include lt;QSqlQueryModelgt; #include lt;QSqlDatabasegt; 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-gt;setupUi(this); } MainWindow::~MainWindow() { delete ui; DB = QSqlDatabase::addDatabase("QSQLITE"); DB.setDatabaseName("Prices.sqlite"); if (DB.open()) { qDebug() lt;lt; "Open"; model = new QSqlQueryModel(); QSqlQuery* qry = new QSqlQuery(DB); qry-gt;prepare("SELECT * FROM Prices"); qry-gt;exec(); model-gt;setQuery(*qry); ui-gt;tableView-gt;setModel(model); qDebug() lt;lt; "Rows: " lt;lt; model-gt;rowCount(); DB.close(); } else { qDebug() lt;lt; "Failed connection"; } }
Комментарии:
1. 1-е выключение: Это предупреждающее сообщение, а не ошибка.
2. 2-й: QSqlQuery протекает. Создайте его в стеке, а затем передайте в setQuery() через std::move()
Ответ №1:
Они хотят, чтобы вы переместили объект позади qry
в функцию.
Самым коротким изменением было бы заменить
model-gt;setQuery(*qry);
с
model-gt;setQuery(std::move(*qry)); delete qry;
Однако в этом случае вам не нужно использовать new/delete. Просто использование автоматической продолжительности хранения работает:
QSqlQuery qry(DB); qry.prepare("SELECT * FROM Prices"); qry.exec(); model-gt;setQuery(std::move(qry));
Тогда вам не придется беспокоиться о том, что вы забудете удалить его.