# /////////////////////////////////////////////////////////////// # # BY: WANDERSON M.PIMENTA # PROJECT MADE WITH: Qt Designer and PySide6 # V: 1.0.0 # # This project can be used freely for all uses, as long as they maintain the # respective credits only in the Python scripts, any information in the visual # interface (GUI) can be modified without any implication. # # There are limitations on Qt licenses if you want to use your products # commercially, I recommend reading them on the official website: # https://doc.qt.io/qtforpython/licenses.html # # /////////////////////////////////////////////////////////////// from PySide6.QtWidgets import QFileDialog from PySide6.QtCore import Signal, Slot from PySide6.QtSql import QSqlTableModel,QSqlDatabase import sqlite3 import sys import os import platform from tkinter import messagebox # IMPORT / GUI AND MODULES AND WIDGETS # /////////////////////////////////////////////////////////////// from modules import * from widgets import * os.environ["QT_FONT_DPI"] = "96" # FIX Problem for High DPI and Scale above 100% # SET AS GLOBAL WIDGETS # /////////////////////////////////////////////////////////////// widgets = None excelname = '' # 获取项目根目录 project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) # 将项目根目录添加到 sys.path sys.path.append(project_root) # 表格的模型 class MyTableModel(QAbstractTableModel): def __init__(self, data): super().__init__() self._data = data # 重新定义行数 def rowCount(self, parent=QModelIndex()): return len(self._data) # 重新定义列数 def columnCount(self, parent=QModelIndex()): return len(self._data[0]) if self._data else 0 # 重新定义数据 def data(self, index, role=Qt.DisplayRole): if not index.isValid(): return None if role == Qt.DisplayRole: return self._data[index.row()][index.column()] return None class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) # super().__init__() # SET AS GLOBAL WIDGETS # /////////////////////////////////////////////////////////////// self.ui = Ui_MainWindow() self.ui.setupUi(self) # self.comboBox_2 = QComboBox(self) # ...此处为省略代码... global widgets widgets = self.ui # 是否使用系统自带标题栏 True是不使用,False使用 # /////////////////////////////////////////////////////////////// Settings.ENABLE_CUSTOM_TITLE_BAR = True # APP名称 # /////////////////////////////////////////////////////////////// title = "控制网复测平面基准归算程序" description = "控制网复测平面基准归算程序" # APPLY TEXTS self.setWindowTitle(title) widgets.titleRightInfo.setText(description) # TOGGLE MENU # /////////////////////////////////////////////////////////////// widgets.toggleButton.clicked.connect(lambda: UIFunctions.toggleMenu(self, True)) # SET UI DEFINITIONS # /////////////////////////////////////////////////////////////// UIFunctions.uiDefinitions(self) # QTableWidget PARAMETERS # /////////////////////////////////////////////////////////////// # widgets.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 点击事件 # /////////////////////////////////////////////////////////////// # 左边菜单 # 首页 widgets.btn_home.clicked.connect(self.buttonClick) # 输入表格 widgets.btn_widgets.clicked.connect(self.buttonClick) # 成果预览 widgets.btn_new.clicked.connect(self.buttonClick) # 数据一览 widgets.btn_data.clicked.connect(self.buttonClick) # 皮肤切换 widgets.btn_message.clicked.connect(self.buttonClick) # 打开上传文件夹 widgets.upload.clicked.connect(self.buttonClick) # 拓展左侧栏 # def openCloseLeftBox(): # UIFunctions.toggleLeftBox(self, True) # widgets.toggleLeftBox.clicked.connect(openCloseLeftBox) # widgets.extraCloseColumnBtn.clicked.connect(openCloseLeftBox) # EXTRA RIGHT BOX def openCloseRightBox(): UIFunctions.toggleRightBox(self, True) widgets.settingsTopBtn.clicked.connect(openCloseRightBox) # 展示APP # /////////////////////////////////////////////////////////////// self.show() # 设置主题 # /////////////////////////////////////////////////////////////// if getattr(sys, 'frozen', False): absPath = os.path.dirname(os.path.abspath(sys.executable)) elif __file__: absPath = os.path.dirname(os.path.abspath(__file__)) useCustomTheme = True self.useCustomTheme = useCustomTheme self.absPath = absPath themeFile = r"Front\themes\py_dracula_light.qss" # 设置主题和HACKS if useCustomTheme: # LOAD AND APPLY STYLE UIFunctions.theme(self, themeFile, True) # SET HACKS AppFunctions.setThemeHack(self) # 设置主页和选择菜单 # /////////////////////////////////////////////////////////////// widgets.stackedWidget.setCurrentWidget(widgets.home) widgets.btn_home.setStyleSheet(UIFunctions.selectMenu(widgets.btn_home.styleSheet())) self.bind() #绑定组件 def bind(self): # 计算 widgets.compute.clicked.connect(self.computeClick) #删除tableview def delete_table_view(table_view): table_view.setParent(None) table_view.deleteLater() #默认第一个参数是self,所以使用时只有一个参数 #稳定性成果表 def Arrange_Data(self,list1): #最终return的 list2 = [] #点号部分 nlist = [] for data1 in list1: #点名 #存每一行的数据 resultlist = [] pn = data1[0].decode('utf-8') resultlist.append(pn) nlist.append(pn) resultlist.append(data1[1]) resultlist.append(data1[2]) resultlist.append(data1[3]) resultlist.append(data1[4]) resultlist.append(data1[5]) resultlist.append(data1[6]) resultlist.append(data1[7]) resultlist.append(data1[8]) resultlist.append(data1[9]) resultlist.append(data1[10]) resultlist.append(data1[11]) #判定1 an1 = data1[12].decode('utf-8') resultlist.append(an1) resultlist.append(data1[13]) resultlist.append(data1[14]) resultlist.append(data1[15]) #判定2 an2 = data1[16].decode('utf-8') resultlist.append(an2) list2.append(resultlist) return nlist,list2 #复测成果表 def Arrange_Data1(self,list1): #最终return的 list2 = [] #点号部分 nlist = [] for data1 in list1: #点名 #存每一行的数据 resultlist = [] pn = data1[0].decode('utf-8') resultlist.append(pn) nlist.append(pn) resultlist.append(data1[1]) resultlist.append(data1[2]) resultlist.append(data1[3]) resultlist.append(data1[4]) resultlist.append(data1[5]) resultlist.append(data1[6]) resultlist.append(data1[7]) #判定 an1 = data1[8].decode('utf-8') resultlist.append(an1) list2.append(resultlist) return nlist,list2 #基准归算表 def Arrange_Data2(self,list1): #最终return的 list2 = [] #点号部分 nlist = [] for data1 in list1: #点名 #存每一行的数据 resultlist = [] pn = data1[0].decode('utf-8') resultlist.append(pn) nlist.append(pn) resultlist.append(data1[1]) resultlist.append(data1[2]) resultlist.append(data1[3]) resultlist.append(data1[4]) resultlist.append(data1[5]) #判定 an1 = data1[6].decode('utf-8') resultlist.append(an1) list2.append(resultlist) return nlist,list2 #稳定性成果表 def Data_in_Cell(self,list1): model = QStandardItemModel() xx = 0 while xx < len(list1): data1 = list1[xx] #点号 cell1 = str(data1[0]) item = QStandardItem(cell1) model.setItem(xx, 0, item) #首期 cell1 = str(round(data1[1],4)) item = QStandardItem(cell1) model.setItem(xx, 1, item) cell1 = str(round(data1[2],4)) item = QStandardItem(cell1) model.setItem(xx, 2, item) #上期 cell1 = str(round(data1[3],4)) item = QStandardItem(cell1) model.setItem(xx, 3, item) cell1 = str(round(data1[4],4)) item = QStandardItem(cell1) model.setItem(xx, 4, item) #权 cell1 = str(int(data1[5])) item = QStandardItem(cell1) model.setItem(xx, 5, item) #本期 cell1 = str(round(data1[6],4)) item = QStandardItem(cell1) model.setItem(xx, 6, item) cell1 = str(round(data1[7],4)) item = QStandardItem(cell1) model.setItem(xx, 7, item) #权 cell1 = str(int(data1[8])) item = QStandardItem(cell1) model.setItem(xx, 8, item) #本-首 cell1 = str(round(data1[9],1)) item = QStandardItem(cell1) model.setItem(xx, 9, item) cell1 = str(round(data1[10],1)) item = QStandardItem(cell1) model.setItem(xx, 10, item) cell1 = str(round(data1[11],1)) item = QStandardItem(cell1) model.setItem(xx, 11, item) #判定(如果是稳定则不显示) cell1 = str(data1[12]) if cell1 == '稳定': cell1 = '' item = QStandardItem(cell1) model.setItem(xx, 12, item) #本-上 cell1 = str(round(data1[13],1)) item = QStandardItem(cell1) model.setItem(xx, 13, item) cell1 = str(round(data1[14],1)) item = QStandardItem(cell1) model.setItem(xx, 14, item) cell1 = str(round(data1[15],1)) item = QStandardItem(cell1) model.setItem(xx, 15, item) #判定 cell1 = str(data1[16]) if cell1 == '稳定': cell1 = '' item = QStandardItem(cell1) model.setItem(xx, 16, item) xx = xx + 1 return model #复测成果表 def Data_in_Cell1(self,list1): model = QStandardItemModel() xx = 0 while xx < len(list1): data1 = list1[xx] #点号 cell1 = str(data1[0]) item = QStandardItem(cell1) model.setItem(xx, 0, item) #上期 cell1 = str(round(data1[1],4)) item = QStandardItem(cell1) model.setItem(xx, 1, item) cell1 = str(round(data1[2],4)) item = QStandardItem(cell1) model.setItem(xx, 2, item) #本期 cell1 = str(round(data1[3],4)) item = QStandardItem(cell1) model.setItem(xx, 3, item) cell1 = str(round(data1[4],4)) item = QStandardItem(cell1) model.setItem(xx, 4, item) #上-本 cell1 = str(round(data1[5],1)) item = QStandardItem(cell1) model.setItem(xx, 5, item) cell1 = str(round(data1[6],1)) item = QStandardItem(cell1) model.setItem(xx, 6, item) cell1 = str(round(data1[7],1)) item = QStandardItem(cell1) model.setItem(xx, 7, item) #判定(如果是稳定则不显示) cell1 = str(data1[8]) if cell1 == '稳定': cell1 = '' item = QStandardItem(cell1) model.setItem(xx, 8, item) xx = xx + 1 return model #基准归算表 def Data_in_Cell2(self,list1): model = QStandardItemModel() xx = 0 while xx < len(list1): data1 = list1[xx] #点号 cell1 = str(data1[0]) item = QStandardItem(cell1) model.setItem(xx, 0, item) #计算 cell1 = str(round(data1[1],4)) item = QStandardItem(cell1) model.setItem(xx, 1, item) cell1 = str(round(data1[2],4)) item = QStandardItem(cell1) model.setItem(xx, 2, item) #上-计 cell1 = str(round(data1[3],1)) item = QStandardItem(cell1) model.setItem(xx, 3, item) cell1 = str(round(data1[4],1)) item = QStandardItem(cell1) model.setItem(xx, 4, item) cell1 = str(round(data1[5],1)) item = QStandardItem(cell1) model.setItem(xx, 5, item) #判定(如果是稳定则不显示) cell1 = str(data1[6]) if cell1 == '稳定': cell1 = '' item = QStandardItem(cell1) model.setItem(xx, 6, item) xx = xx + 1 return model def computeClick(self): # GET BUTTON CLICKED btn = self.sender() btnName = btn.objectName() #处理选中的文件 # print(file_path) UIFunctions.compute_show_process_excel_file(self, file_path) current_text = self.ui.comboBox_2.currentText() db_path = r"D:\4work_now\20240819GS\ControlNetwork\ControlNetwork\UI\SQL\DataBase.db" #转换下 excelname = os.path.basename(file_path) utf_en = excelname.encode('utf-8') # file_path = file_path if current_text == "水准测段高差稳定计算": #只显示一个tab self.ui.tabWidget.setTabVisible(0,True) self.ui.tabWidget.setTabVisible(1,False) self.ui.tabWidget.setTabVisible(2,False) #重新设置文字名称 self.ui.tabWidget.setTabText(0,'测段高差计算表') # 计算结束自动跳转结果页面,并保留查询内容,以便输出 widgets.stackedWidget.setCurrentWidget(widgets.new_page) # SET PAGE UIFunctions.resetStyle(self, btnName) # RESET ANOTHERS BUTTONS SELECTED btn.setStyleSheet(UIFunctions.selectMenu(btn.styleSheet())) # SELECT MENU elif current_text == "控制网复测平面基准计算": #就用已有的选项卡 self.ui.tabWidget.setTabVisible(0,True) self.ui.tabWidget.setTabVisible(1,True) self.ui.tabWidget.setTabVisible(2,True) #重新设置文字名称 self.ui.tabWidget.setTabText(0,'复测成果表') self.ui.tabWidget.setTabText(1,'基准归算模型') self.ui.tabWidget.setTabText(2,'复测基准归算表') #链接数据库并显示 # 连接到数据库 #将结果输出到数据库 db1 = sqlite3.connect(db_path) #获取游标 cursor1 = db1.cursor() #查询表内符合的所有数据(分成两个结果分别显示) #复测成果表 sqlstr1 = 'select PointName,Last_X,Last_Y,Result_X,Result_Y,Last_ResultX,Last_ResultY,Last_ResultP,Dis_Ass from GS_Result_Point WHERE TableName = ?' cursor1.execute(sqlstr1,(utf_en,)) #获取结果集 result1 = cursor1.fetchall() #基准归算表 sqlstr11 = 'select PointName,Cal_X,Cal_Y,Last_CalX,Last_CalY,Last_CalP,Dis_Ass from GS_Result_Point WHERE TableName = ?' cursor1.execute(sqlstr11,(utf_en,)) #获取结果集 result2 = cursor1.fetchall() #对结果集进行处理,把汉字转换过来,添加表头部分 nlist1,plist1 = self.Arrange_Data1(result1) nlist2,plist2 = self.Arrange_Data2(result2) # 创建一个数据模型(复测成果表) self.model1 = QStandardItemModel() #把数据放进去 model1 = self.Data_in_Cell1(plist1) model2 = self.Data_in_Cell2(plist2) #设置表头 model1.setHorizontalHeaderLabels(['点名', '前期X','前期Y','本期X', '本期Y','前期-本期X','前期-本期Y','前期-本期P','位移判定']) model1.setVerticalHeaderLabels(nlist1) #QTableView并将数据模型与之关联 self.ui.resultTableView.setModel(model1) self.ui.resultTableView.show() #设置表头 model2.setHorizontalHeaderLabels(['点名', '基准归算X','基准归算Y','前期-归算X','前期-归算Y','前期-归算P','位移判定']) model2.setVerticalHeaderLabels(nlist2) #QTableView并将数据模型与之关联 self.ui.reconTableView.setModel(model2) self.ui.reconTableView.show() #富文本的html sqlstr2 = 'select Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 from GS_Trans_Param WHERE TableName = ?' cursor1.execute(sqlstr2,(utf_en,)) #获取结果集 result1 = cursor1.fetchall() str1 = result1[0][0].decode('utf-8') str2 = result1[0][1].decode('utf-8') n1 = result1[0][2] n2 = result1[0][3] n3 = result1[0][4] n4 = result1[0][5] n5 = result1[0][6] n6 = result1[0][7] str0 = """

"""+str2+"""--"""+str1+"""已知系统转换公式:

X=("""+str(n1)+""")x+("""+str(n2)+""")y+("""+str(n3)+""")

Y=("""+str(n4)+""")x+("""+str(n5)+""")y+("""+str(n6)+""")

式中:x、y"""+str2+"""坐标;

X、Y为"""+str1+"""已知系统的"""+str2+"""归算坐标。

""" self.ui.printTableView.setHtml(str0) # 计算结束自动跳转结果页面,并保留查询内容,以便输出 widgets.stackedWidget.setCurrentWidget(widgets.new_page) # SET PAGE UIFunctions.resetStyle(self, btnName) # RESET ANOTHERS BUTTONS SELECTED btn.setStyleSheet(UIFunctions.selectMenu(btn.styleSheet())) # SELECT MENU # GS.main_function(file_path, db_path) # 添加控制网执行代码 elif current_text=="平面控制网稳定性计算": #只显示头两个tab self.ui.tabWidget.setTabVisible(0,True) self.ui.tabWidget.setTabVisible(1,True) self.ui.tabWidget.setTabVisible(2,False) #重新设置文字名称 self.ui.tabWidget.setTabText(0,'稳定性分析成果表') self.ui.tabWidget.setTabText(1,'自由网成果归算模型') #链接数据库并显示 # 连接到数据库 #将结果输出到数据库 db1 = sqlite3.connect(db_path) #获取游标 cursor1 = db1.cursor() #查询表内符合的所有数据 sqlstr1 = 'select PointName,First_X,First_Y,Last_X,Last_Y,Last_Wight,Result_X,Result_Y,New_Wight,New_FirstX,New_FirstY,New_FirstP,NFDis_Ass,New_LastX,New_LastY,New_LastP,NLDis_Ass from WD_Result_Point WHERE TableName = ?' cursor1.execute(sqlstr1,(utf_en,)) #获取结果集 result = cursor1.fetchall() #对结果集进行处理,把汉字转换过来,添加表头部分 nlist,plist = self.Arrange_Data(result) # 创建一个数据模型 self.model = QStandardItemModel() #把数据放进去 model1 = self.Data_in_Cell(plist) #设置表头 model1.setHorizontalHeaderLabels(['点名', '首期X','首期Y','上期X', '上期Y','权','本期X','本期Y','权','本期-首期X','本期-首期Y','本期-首期P','位移判定', '本期-上期X','本期-上期Y','本期-上期P','位移判定']) model1.setVerticalHeaderLabels(nlist) #QTableView并将数据模型与之关联 self.ui.resultTableView.setModel(model1) self.ui.resultTableView.show() #富文本的html sqlstr2 = 'select Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 from WD_Result_Param WHERE TableName = ?' cursor1.execute(sqlstr2,(utf_en,)) #获取结果集 result1 = cursor1.fetchall() str1 = result1[0][0].decode('utf-8') str2 = result1[0][1].decode('utf-8') n1 = result1[0][2] n2 = result1[0][3] n3 = result1[0][4] n4 = result1[0][5] n5 = result1[0][6] n6 = result1[0][7] str0 = """

"""+str2+"""--"""+str1+"""已知系统转换公式:

X=("""+str(n1)+""")x+("""+str(n2)+""")y+("""+str(n3)+""")

Y=("""+str(n4)+""")x+("""+str(n5)+""")y+("""+str(n6)+""")

式中:x、y"""+str2+"""坐标;

X、Y为"""+str1+"""已知系统的"""+str2+"""归算坐标。

""" self.ui.printTableView.setHtml(str0) #---------------------------------------------------------- # 计算结束自动跳转结果页面,并保留查询内容,以便输出 widgets.stackedWidget.setCurrentWidget(widgets.new_page) # SET PAGE UIFunctions.resetStyle(self, btnName) # RESET ANOTHERS BUTTONS SELECTED btn.setStyleSheet(UIFunctions.selectMenu(btn.styleSheet())) # SELECT MENU # 点击事件 # 在这里添加点击事件的方法 # /////////////////////////////////////////////////////////////// def buttonClick(self): # GET BUTTON CLICKED btn = self.sender() btnName = btn.objectName() # 首页 if btnName == "btn_home": widgets.stackedWidget.setCurrentWidget(widgets.home) UIFunctions.resetStyle(self, btnName) btn.setStyleSheet(UIFunctions.selectMenu(btn.styleSheet())) # 输入表格 if btnName == "btn_widgets": widgets.stackedWidget.setCurrentWidget(widgets.widgets) UIFunctions.resetStyle(self, btnName) btn.setStyleSheet(UIFunctions.selectMenu(btn.styleSheet())) # 成果预览 if btnName == "btn_new": widgets.stackedWidget.setCurrentWidget(widgets.new_page) # SET PAGE UIFunctions.resetStyle(self, btnName) # RESET ANOTHERS BUTTONS SELECTED btn.setStyleSheet(UIFunctions.selectMenu(btn.styleSheet())) # SELECT MENU # 数据一览 if btnName == "btn_data": widgets.stackedWidget.setCurrentWidget(widgets.datainfo) # SET PAGE UIFunctions.resetStyle(self, btnName) # RESET ANOTHERS BUTTONS SELECTED btn.setStyleSheet(UIFunctions.selectMenu(btn.styleSheet())) # SELECT MENU # 皮肤切换 if btnName == "btn_message": if self.useCustomTheme: themeFile = os.path.abspath(os.path.join(self.absPath, "themes/py_dracula_dark.qss")) UIFunctions.theme(self, themeFile, True) # SET HACKS AppFunctions.setThemeHack(self) self.useCustomTheme = False else: themeFile = os.path.abspath(os.path.join(self.absPath, "themes/py_dracula_light.qss")) UIFunctions.theme(self, themeFile, True) # SET HACKS AppFunctions.setThemeHack(self) self.useCustomTheme = True # 文件上传 if btnName == "upload": global file_path # options = QFileDialog.Options() # 使用 QFileDialog 获取文件路径 file_path, _ = QFileDialog.getOpenFileName( self, "选择文件", "", "表格文件 (*.xls *.xlsx)" ) if file_path: # 处理选中的文件 # print(file_path) UIFunctions.execute_script_based_on_selection(self, file_path) # messagebox.showinfo("提示",f"文件 '{file_name}' 跳转成功!") # 输出点击回馈 print(f'Button "{btnName}" pressed!') # RESIZE EVENTS # /////////////////////////////////////////////////////////////// def resizeEvent(self, event): # Update Size Grips UIFunctions.resize_grips(self) # 鼠标点击事件 # /////////////////////////////////////////////////////////////// def mousePressEvent(self, event): # SET DRAG POS WINDOW self.dragPos = event.globalPos() # 输出鼠标事件 if event.buttons() == Qt.LeftButton: print('Mouse click: LEFT CLICK') if event.buttons() == Qt.RightButton: print('Mouse click: RIGHT CLICK') if __name__ == "__main__": app = QApplication(sys.argv) app.setWindowIcon(QIcon("icon.ico")) window = MainWindow() # window.resize(1440, 960) # 高宽 sys.exit(app.exec())