Я использую QSqlTableModel в Qt, но функция select возвращает false

У меня проблемы с использованием функции выбора для QSqlTableModel. Он всегда возвращает false, и я не смог понять, почему.

Я настроил базу данных SQL, используя PostgreSQL. Я смог добавить базу данных, используя QSqlDatabase::addDatabase, и я смог использовать QSqlQuery для извлечения данных из базы данных и создания новых таблиц и новых строк в таблицах. Теперь я пытаюсь отобразить базу данных в TableView. Я обнаружил, что вы можете создать QSqlTableModel для подключения к TableView. Однако на шаге выбора происходит сбой.

Вот код, который я запускаю:

_database = loadDatabase();
qDebug()<<"table database name: "<<_database.databaseName()<<endl;  //Returns: table database name:  "postgres"
qDebug()<<"table database isOpen: "<<_database.isOpen()<<endl;      //Returns: table database isOpen:  true
qDebug()<<"table database tables: "<<_database.tables()<<endl;      //Returns: table database tables:  ("Test", "testtable")
qDebug()<<"last error: "<<_database.lastError().text()<<endl;       //Returns: last error:  " "

_tableModel = new QSqlTableModel(this,_database);
_tableModel->setTable(_database.tables().at(1));
_tableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
if(_tableModel->select()){
    qDebug()<<"Table was selected!"<<endl;
}
else{
    qDebug()<<"Table could not be selected"<<endl;
}

qDebug()<<"is database valid: "<<_database.isValid()<<endl;     //Returns: is database valid:  true

_database определяется как QSqlDatabase. Всегда возвращает Таблица не может быть выбрана.

Я нашел ответ на Stack Overflow, в котором предлагалось проверить, является ли база данных Open (), правильно ли имя таблицы и есть ли какие-либо сообщения об ошибках с помощью lastError (). Я включил эти ответы в операторы отладки в своем коде. Вроде бы все правильно, но все же возвращает false.

Любая помощь будет принята с благодарностью. Спасибо!


person Nekreg45    schedule 02.03.2021    source источник
comment
Есть ли у пользователя postgres права на выбор данных? Можете ли вы запустить запрос выбора в оболочке psql?   -  person mugiseyebrows    schedule 03.03.2021
comment
Я так считаю. Я новичок в этом SQL. Я могу использовать следующий код: code QSqlQuery qry(_database); QString string = "SELECT * FROM " + _database.tables().at(1)+";"; if(qry.exec(string)){ qDebug()<<"Query succeeded!"<<endl; QSqlRecord rec = qry.record(); while (qry.next()){ qDebug() << qry.value(0).toString()+" "+qry.value(1).toString()+" "+qry.value(2).toString(); } } Это успешно распечатывает записи в таблице. Отвечает ли это на ваш вопрос?   -  person Nekreg45    schedule 03.03.2021
comment
Попробуйте добавить qDebug() << _database.lastError().text(); после _tableModel->select(), чтобы увидеть сообщение об ошибке   -  person mugiseyebrows    schedule 04.03.2021
comment
Это тот же результат. Это пустая строка. Я мог бы попробовать что-то отличное от PostgreSQL и посмотреть, связано ли это с этим.   -  person Nekreg45    schedule 04.03.2021


Ответы (1)


Я понял. Это проблема с PostgreSQL. В частности, версии более поздние, чем 10 или 11, похоже, не работают с QSqlTableModel. Я использовал версию 13. В коде было какое-то изменение, которое сломало это с Qt. Тем не менее, это сообщается как ошибка Qt.

Вот отчет об ошибке Qt: https://bugreports.qt.io/browse/QTBUG-79033

Похоже, вы можете использовать патч. Я закончил тем, что вернулся к более ранней версии, чтобы исправить это.

Спасибо за помощь!

person Nekreg45    schedule 04.03.2021