【问题标题】:QSqlQueryModel in a QML view causes items being shown twiceQML 视图中的 QSqlQueryModel 导致项目显示两次
【发布时间】:2013-07-31 14:50:39
【问题描述】:

感谢 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
            }
        }
    }
}
}

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

消息!

消息!

有什么帮助吗?谢谢!

【问题讨论】:

    标签: qt listview qml qtsql


    【解决方案1】:

    好的,终于找到错误了。

    根据这个错误报告:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我不这么认为:如果我更改文本并重新编译,两行中的文本都会更改,但没有添加或删除任何内容。
      • 您是否使用 sqlite.exe 检查过数据库的内容?
      • 是的,正如你所说,这些句子在这里多次出现。但是我只是尝试手动删除数据库文件,并且只再次运行我的程序一次,并且数据仍然会在数据库中创建两次......为什么? (顺便说一句,我的代码中已经有了它:QFile::remove("my.db.sqlite"); 在程序的开头。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2017-10-14
      相关资源
      最近更新 更多