感謝Jay,問題似乎不在QML中,而僅在數據庫中。QSqlQueryModel在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
}
}
}
}
}
我應該得到 「消息」!作爲我的列表中的輸出,但我得到:
消息!
消息!
任何幫助?謝謝!
我不這麼認爲:如果我改變文本並重新編譯,文本在兩行中都會改變,但沒有任何內容會被添加或刪除。 –
您是否使用sqlite.exe檢查過數據庫的內容? – Jay
是的,正如你所說的,句子在這裏多次出現。但我只是試圖手動刪除數據庫文件,並再次運行我的程序一次,數據仍然會在數據庫中創建兩次......爲什麼? (順便說一下,我已經在我的代碼中:'QFile :: remove(「my.db.sqlite」);'在程序的開始處)。 –