2013-07-31 54 views
1

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

我應該得到 「消息」!作爲我的列表中的輸出,但我得到:

消息!

消息!

任何幫助?謝謝!

回答

0

我認爲你的sqllite數據庫包含多個記錄。

如果你多次運行這個應用程序,我會認爲表創建失敗,那麼它會插入另一行,然後它會顯示多行。

您可以使用sqlite命令行應用程序來驗證數據庫的內容。

+0

我不這麼認爲:如果我改變文本並重新編譯,文本在兩行中都會改變,但沒有任何內容會被添加或刪除。 –

+0

您是否使用sqlite.exe檢查過數據庫的內容? – Jay

+0

是的,正如你所說的,句子在這裏多次出現。但我只是試圖手動刪除數據庫文件,並再次運行我的程序一次,數據仍然會在數據庫中創建兩次......爲什麼? (順便說一下,我已經在我的代碼中:'QFile :: remove(「my.db.sqlite」);'在程序的開始處)。 –

相關問題