关于使用Eric6和pyqt5,写一个三级联动的demo

3 篇文章 0 订阅
2 篇文章 0 订阅

新建项目

选择下拉框以及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数据库中,没有贴设计页面的代码

运行的结果:

关于在Eric中新建的项目点击不能出现designer.exe,见我的另一篇解决Could not start Qt-Designer

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裸睡的雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值