[C ][ QT ] не предназначен для копирования. Пройди мимо, двигайся вместо этого

#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));  

Тогда вам не придется беспокоиться о том, что вы забудете удалить его.