2012-03-20 44 views
1

我最近開始使用QT,並遇到一個小問題。我似乎無法理解QVariant是如何工作的。我一直在尋求幫助,並在網上尋找,但它並沒有陷入。在我的項目中,我試圖用數據庫中的製造商列表填充組合框。我已經打開數據庫並提取條目,但我將它們重命名爲manValue。現在我明白爲什麼會發生這種情況,問題是我不明白如何正確使用QVariant來獲得我想要的結果。最初我認爲「manValue」將成爲字符串的標識符,該字符串保存數據庫中的實際值,但它會從數據庫讀取值並確保它不爲空,然後重命名它。在爲QVariant分配任何屬性併爲其分配文本之前,我已經嘗試過創建一個字符串,然後將該字符串插入manValue但仍然沒有運氣的位置。任何幫助將不勝感激。對不起,我知道這很簡單,我只是一個小菜鳥,幫助文檔經常讓我困惑。從數據庫提取數據時使用QVariant的正確方法

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); 
db.setHostName("LOCALHOST\\TestERPServer"); 
db.setDatabaseName("TestERPConnection"); 

if (db.open()) 
{ 
    QMessageBox::information(this,"Connected","Connection to the Database was Established\n" 
          "\nStatus: Connected"); 

    QSqlQuery mfrQry; 

    if (mfrQry.exec("SELECT * FROM erp_data.manufacturers;")) 
    { 
     if (mfrQry.value(1) == "") 
     { 
      QMessageBox::information(this,"No Connection","Nothing in the Manufacturer Database\n" 
            "\nError: " + db.lastError().text()); 
     } 
     else 
     { 
      while (mfrQry.next()) 
      { 
       ui->mfrComboBox->addItem("manValue",QVariant(mfrQry.value(1))); 
      } 
     } 
    } 
    else 
    { 
     QMessageBox::information(this,"No Connection","Connection to the Manufacturer Database could not be Established\n" 
           "\nError: " + db.lastError().text()); 
    } 
} 
else 
{ 
    QMessageBox::information(this,"No Connection","Connection to the Database could not be Established\n" 
          "\nError: " + db.lastError().text()); 
} 
+0

即使它的設計相當不錯,Qt是複雜的,它需要很長的時間才能掌握。請不要爲不知道而道歉。 – 2012-03-20 20:54:42

+0

謝謝,但真的,我已經開始約2周。掌握這樣的東西,我相信可以讓我度過一生,特別是如果他們不斷更新大聲笑,但到目前爲止,我真的很享受Qt的行爲方式。 – Rob 2012-03-20 20:57:36

回答

2

提供的代碼中的第一個問題與您操縱QSqlQuery的方式有關。

成功執行的SQL語句將查詢的狀態設置爲活動 以便isActive()返回true。否則,查詢的狀態設置爲 不活動。在任何一種情況下,執行新的SQL語句時, 查詢都位於無效記錄上。 在可以檢索值之前,活動的查詢必須導航到有效記錄 。

爲了移動到你需要使用下面的一個有效的記錄:

一旦你在一個有效的記錄,你必須使用value()功能,以獲得你想要的列。返回值爲QVariant,因此您需要使用QVariant提供的許多toSomething函數之一將其轉換爲所需的類型。

所以你的情況的代碼應該是這樣的:

QSqlQuery mfrQry; 

if (mfrQry.exec("SELECT * FROM erp_data.manufacturers;")) 
{ 
    // This will loop through all records returned by the query 
    while (mfrQry.next()) { 
     // mfrQry.value(COLID) returns a QVariant containing the data of the current 
     // record in column COLID. 
     // Using toString we convert it to String 
     QString stringValue = mfrQry.value(COLID).toString(); 
     // Now handle the QString the way you want... 
    } 
} 
+0

偉大的幫助謝謝 – Rob 2012-03-20 21:23:55