新建项目
选择下拉框以及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