QML视图中的QSqlQueryModel导致项目显示两次

时间:2013-07-31 14:50:40

标签: qt listview qml qtsql

感谢Jay,问题似乎与QML无关,而只在数据库中出现。

所以最小的错误代码是:

QFile::remove("my.db.sqlite");

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("my.db.sqlite");
db.open();

QSqlQuery drop("drop table List;");
QSqlQuery create("create table List (sample_text char(200));");
QSqlQuery insert("insert into List values (\"some message!\");");

drop.exec();
create.exec();
insert.exec();

db.close();

检查my.db.sqlite时,我得到:

sqlite> select * from list;
some message!
some message!

谢谢!

------老问题-------

我正在学习QtSql和QML,所以有一些错误的余地。 我的整个问题几乎都在我的问题的标题中。 我尝试制作一个简短的,自包含的代码来重现它:

C ++代码:

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
    // uncomment after first launch, deleted test to make code short
// QFile::remove("my.db.sqlite"); 

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("my.db.sqlite");
db.open();

QSqlQuery create("create table List (sample_text char(200))");
QSqlQuery create2("insert into List values (\"message !\")");
create.exec();
create2.exec();

QSqlQueryModel *someSqlModel = new QSqlQueryModel();
someSqlModel->setQuery("SELECT * FROM List");

QQmlContext *context = viewer.rootContext();
context->setContextProperty("datamodel", someSqlModel);

viewer.setMainQmlFile(QStringLiteral("qml/test/main.qml"));
viewer.showExpanded();

return app.exec();
}

QML代码:

Rectangle {
ListView {
    width: 200; height: 200
    model: datamodel
    delegate: Row {
        Rectangle {
            width: 100; height: 40
            Text {
                anchors.fill: parent
                text: display
            }
        }
    }
}
}

我应该收到“消息!”作为我的列表中的输出,但我得到:

消息!

消息!

有任何帮助吗?谢谢!

2 个答案:

答案 0 :(得分:1)

好的,最后我发现了错误。

根据此错误报告:

https://bugreports.qt-project.org/browse/QTBUG-30205

如果您将查询放在exec()的构造函数中,则不应调用QSqlQuery

答案 1 :(得分:0)

我认为您的sqllite数据库包含多个记录。

如果您多次运行此应用程序,我认为表创建将失败,然后它将插入另一行,然后它将显示多行。

您可以使用sqlite命令行应用程序来验证数据库的内容。