1. 程式人生 > >關於使用Eric6和pyqt5,寫一個三級聯動的demo

關於使用Eric6和pyqt5,寫一個三級聯動的demo

新建專案

選擇下拉框以及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資料庫中,沒有貼設計頁面的程式碼

執行的結果: