2017-08-15 83 views
0

從sqlite中選擇表名以顯示在組合框tabSelection中時,Combobox dbSelection不會更新以應用於代碼中。PyQt4 Combobox在初始選擇後未更新

單擊按鈕後,加載目錄對話窗口也需要很長時間。

我還想確保數據庫中的所有表都列在tabSelection組合框中。

的代碼如下,與Qt設計文件相關聯:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 
import qcDbWidget2 
import os 
import sqlite3 

class MainDialog(QWidget, qcDbWidget2.Ui_qcQueryWidget): 
    def __init__(self, parent=None): 
     super(MainDialog, self).__init__(parent) 
     self.setupUi(self) 
     self.connect(self.dbDirSelect, SIGNAL("clicked()"), self.getDirName) 

    def getDirName(self): 
     existDir = QFileDialog.getExistingDirectory(self) 
     dbDir = str(existDir) 
     self.dbDirDisplay.setText(dbDir) 

     dbFileList = [] 
     for root, dirs, files in os.walk(dbDir): 
      for file in files: 
       if file.endswith('.db'): 
        dbFileList.append(file) 

     self.dbSelection.addItems(dbFileList) 

     tableList = [] 
     self.dbSelection.update() 

     dbName = str(self.dbSelection.currentText()) 
     dbPath = str(dbDir + '\\' + dbName) 
     conn = sqlite3.connect(dbPath) 
     c = conn.cursor() 

     res = c.execute("SELECT name FROM sqlite_master WHERE type='table';") 
     self.tabSelection.clear() 
     for name in res: 
      tableList.append(name[0]) 
      print(name[0]) 
     for name in tableList: 
      self.tabSelection.addItems(tableList) 

app = QApplication(sys.argv) 
form = MainDialog() 
form.show() 
app.exec_() 
+2

如果您正在使用PyQt4的我建議使用QtSql模塊,例如,如果您使用一個QSqlTableModel的QTableView中,它會自動而不需要編寫SQL請求加載。 – eyllanesc

回答

1

你有沒有考慮使用QTableView代替QTableList
Qt使用MVC哪種方法比手動方式快。

在這種情況下,它非常簡單。
你創建一個模型:

my_model = QStringListModel() 

然後,您可以將數據保存到my_model

my_list = ["toto", "tutu", "tata"] 
my_model.setStringList(my_list) 

一旦你有一個QTableView,你使用它的方法setModel()提供模型。

my_table_view.setModel(my_model) 
+0

我試圖從sqlite數據庫創建表的列表。 – RGETLB

+0

是的,我是這麼認爲的。在這種情況下,只需將my_list的值改爲sqlite數據庫中的表的列表即可。我錯過了什麼? – peyo

+0

謝謝。我會給這個鏡頭。我將不得不考慮創建一個視圖。 – RGETLB