關於使用Eric6和pyqt5,寫一個三級聯動的demo
阿新 • • 發佈:2018-12-10
新建專案
選擇下拉框以及label和按鈕,還有一個tableview用來展示資料
點選儲存,然後選擇compile form 編譯成程式碼,再選擇表單程式碼生成器,選擇下面的函式
點選forms code generator,選擇
生成函式,會有以下檔案
直接將生成的程式碼放在pycharm中執行UI_scrapy_qt中的不用改,程式邏輯在scarpy中
下面就是程式碼的程式邏輯,基本都有註釋
# -*- coding: utf-8 -*- """ Module implementing Dialog. """ from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import * from PyQt5.QtGui import * from Ui_scarpy_qt_1 import Ui_Dialog from common import databack class Dialog(QDialog, Ui_Dialog): """ Class documentation goes here. """ def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(Dialog, self).__init__(parent) self.setupUi(self) # 初始化操作委託到initUI() self.initUI() def initUI(self): self.province_data = databack.get_province_data() # 初始化四級聯動下拉框的資料 self.choosep = '' self.choosec = '' self.chooset = '' self.chooses = '' self.result_text.setText('(未選擇)') # 清理當前下拉框的內容 self.comboBox.clear() self.comboBox_2.clear() self.comboBox_3.clear() self.comboBox_4.clear() # 初始化下拉框的展示內容 self.comboBox.addItem('-請選擇-') # 將獲取到的省的資料新增到下拉框中 for s in self.province_data: self.comboBox.addItem(s[1], s[0]) @pyqtSlot(int) def on_comboBox_activated(self, index): """ Slot documentation goes here. @param index DESCRIPTION @type int """ # TODO: not implemented yet # 因為我們在初始化的時候添加了請選擇,所以需要做判斷看當前是否點選它了 if index == 0: # 點選請選擇按鈕後,我們需要對省、市、區、街道進行三級聯動資料清理 self.choosep = '' self.choosec = '' self.chooset = '' self.chooses = '' # 需要清理後面市、區、街道的內容 self.comboBox_2.clear() self.comboBox_3.clear() self.comboBox_4.clear() return # 獲取當前選擇的省份資料,取出鍵, procode = self.comboBox.itemData(index) # 取出值 self.pro_name = self.comboBox.itemText(index) # 根據鍵查詢資料,獲取市的資料 self.choosep = databack.get_city_data(procode) # 清理市、區、街道下拉框內容 self.comboBox_2.clear() self.comboBox_3.clear() self.comboBox_4.clear() # 當前所選省的市級下拉框內容新增 self.comboBox_2.addItem('-請選擇-') for s in self.choosep: self.comboBox_2.addItem(s[1], s[0]) # self.data[] @pyqtSlot(int) def on_comboBox_2_activated(self, index): """ Slot documentation goes here. @param index DESCRIPTION @type int """ # TODO: not implemented yet if index == 0: # 初始化市、區資料 self.choosec = '' self.chooset = '' self.chooses = '' # 清理區的下拉框內容 self.comboBox_3.clear() self.comboBox_4.clear() return # 獲取當前所選市的資料,取出鍵 city_id = self.comboBox_2.itemData(index) # 取出值 self.city_name = self.comboBox_2.itemText(index) # 查詢資料庫 self.choosec = databack.get_county_data(city_id) # 清理區的下拉框內容 self.comboBox_3.clear() # 當前所選市的區下拉框內容新增 self.comboBox_3.addItem('-請選擇-') for s in self.choosec: self.comboBox_3.addItem(s[1], s[0]) @pyqtSlot(int) def on_comboBox_3_activated(self, index): """ Slot documentation goes here. @param index DESCRIPTION @type int """ # TODO: not implemented yet if index == 0: self.chooset = '' self.chooses = '' # 清理區的下拉框內容 self.comboBox_4.clear() return # 獲取當前所選區資料,取出鍵 county_id = self.comboBox_3.itemData(index) # 取出值 self.county_name = self.comboBox_3.itemText(index) self.chooset = databack.get_street_data(county_id) # 清理區的下拉框內容 self.comboBox_4.clear() # 當前所選市的區下拉框內容新增 self.comboBox_4.addItem('-請選擇-') for s in self.chooset: self.comboBox_4.addItem(s[1], s[0]) @pyqtSlot(int) def on_comboBox_4_activated(self, index): """ Slot documentation goes here. @param index DESCRIPTION @type int """ # TODO: not implemented yet if index == 0: # 初始化街道的資料 self.chooses = '' return # 獲取當前所選街道資料 self.chooses = self.comboBox_4.itemData(index) self.street_name = self.comboBox_4.itemText(index) @pyqtSlot() def on_pushButton_clicked(self): """ Slot documentation goes here. """ # TODO: not implemented yet str_result = '(未選擇)' if self.pro_name: str_result = self.pro_name if self.city_name: str_result = str_result + '-' + self.city_name if self.county_name: str_result = str_result + '-' + self.county_name if self.street_name: str_result = str_result + '-' + self.street_name self.result_text.setText(str_result) # 根據所選拼接查詢資料的條件 data = {"meishi_street_id": self.chooses} meishi_s = databack.get_meishi_st(data) # 定義列表 itemlist = [] for m in meishi_s: title = m[0] address = m[1] avg_score = m[2] avg_price = m[3] item = (title, address, avg_score, avg_price) itemlist.append(item) # 建立tableview的model self.model = QStandardItemModel(len(itemlist), 4) # 設定頭 self.model.setHorizontalHeaderLabels(['店鋪', '地址', '評分', '平均價格']) for i in range(len(itemlist)): print(itemlist[i]) # 設定每個i行j列的值 item1 = QStandardItem(itemlist[i][0]) item2 = QStandardItem(itemlist[i][1]) item3 = QStandardItem(str(itemlist[i][2])) item4 = QStandardItem(str(itemlist[i][3])) # 將每個item存到model中 self.model.setItem(i, 0, item1) self.model.setItem(i, 1, item2) self.model.setItem(i, 2, item3) self.model.setItem(i, 3, item4) # self.tableView = QTableView() # 下面程式碼讓表格100填滿視窗 self.tableView.horizontalHeader().setStretchLastSection(True) self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.tableView.setModel(self.model) @pyqtSlot() def on_tableView_activated(self, index): """ Slot documentation goes here. @param index DESCRIPTION @type QModelIndex """ # TODO: not implemented yet raise NotImplementedError if __name__ == '__main__': import sys app = QApplication(sys.argv) linkage = Dialog() linkage.show() sys.exit(app.exec_())
其中的common中的databack是用來查詢mongodb資料庫中,沒有貼設計頁面的程式碼
執行的結果: