Unable to retrieve information from records within a QSqlQueryModel
-
Dear all,
This is probably a trivial problem but I cannot find the solution to it. Basically it is as follows. I have created a Qt Widgets Application. The main window contains a model-based list view and a push button. The list view is filled with records from a (MySQL) database. When I press the push button I want to get the information from the record associated with the currently selected list view item. In other words, I want to retrieve information from the model, not from the list view.
I know that it is possible to extract information from records within a QSqlQueryModel (qt-project.org/doc/qt-5/qsqlquerymodel.html#record):
model.record(4).value("salary").toInt();
I tried to retrieve the information using the record function:
qDebug()<<ui->listView->model()->record(0);
This creates an error:
'class QAbstractItemModel' has no member named 'record'
I then tried to change to:
qDebug()<<ui->listView->model();
This creates no error and when I press the push button the debug output is:
QSqlQueryModel(0x9386140)
What I do not understand is why it is first recognized as a QAbstractItemModel (which does not have the record function) and then as a QSqlQueryModel (which does have the record function).
How should I proceed to retrieve the information using the record function?
Thanks.
Here is an example, although the database connection is left out (this works).
@#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
if ( !connOpen() ) {
qDebug()<<"Failed to open the database";
return;
}
// fill list view with data from database
QSqlQueryModel model = new QSqlQueryModel();
QSqlQuery* qry=new QSqlQuery(mydb);
qry->prepare("SELECT Type FROM CourseWorkType");
qry->exec();
model->setQuery(*qry);
ui->listView->setModel((model));
}MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::on_pushButton_clicked()
{
qDebug()<<ui->listView->model(); // works
//qDebug()<<ui->listView->model()->record(0); // creates error message
}
@ -
Try this.
@QSqlQueryModel sqlModel = (QSqlQueryModel)ui->listView->model();
sqlModel->record(1)@ -
For the record (no pun intended), both solutions work. Thanks Dheerendra and turaz!
It returns:
QSqlRecord( 1 )
" 0:" QSqlField("Type", QString, length: 150, precision: 0, required: yes, generated: yes, typeID: 253) "Preparing"I can now retrieve the string "Preparing" from the record as follows:
@qDebug() << sql_model->record(0).value("Type").toString();@
-
Hi,
Both works but both are wrong techniques. When casting a QObject use qobject_cast. C style cast nor static_cast do any check to guarantee that the pointer you are casting can in fact be casted to the new type.
-
Yes, qobject_cast make sense here. SGaist is right.
-
Thanks, SGaist!
I've changed:
@QSqlQueryModel sql_model = static_cast <QSqlQueryModel> (ui->listView->model());@
To:
@QSqlQueryModel sql_model = qobject_cast <QSqlQueryModel> (ui->listView->model());@
I'm assuming that it would create an error message if the pointer I'm casting cannot be casted to the new type.
-
To be completely safe, a check that sql_model is non zero should be added. qobject_cast will return 0 if it can't successfully cast