Fork me on GitHub

Python中的PYQT5

文件转换及程序封装命令

    & .\.venv\Scripts\activate 
    pyrcc5 D:\Kostal\Personality\ExtendItems\ExcelFilter\QtResource\Icon.qrc -o D:\Kostal\Personality\ExtendItems\ExcelFilter\QtResource\Icon_rc.py
    pyuic5 -x Maincode\ExcelFilter.ui -o Maincode\ExcelFilter_UI.py
    pyuic5 -x Functions\CustomerReportGenerate_UI.ui -o Functions\CustomerReportGenerate_UI.py
    pyinstaller -F -w -i D:\Kostal\Personality\ExtendItems\ExcelFilter\QtResource\file_excel.ico D:\Kostal\Personality\ExtendItems\ExcelFilter\MainCode\ExcelFilter.py

设置UI窗口的自适应

QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)
QtGui.QGuiApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) #保证相对大小

 Qt控件

UI运行demo

        #处理分辨率的问题
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)
        QtGui.QGuiApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) #保证相对大小

        #设置全局异常钩子
        package_sys.excepthook = Func_SysExceptionHook

        app = QtWidgets.QApplication(package_sys.argv)
        Form = QtWidgets.QWidget()
        ui = ExcelFilter_UI.Ui_Form()
        ui.setupUi(Form)
        slotFunc = Ui_SlotFunction() # 创建相关的槽函数

        #按钮控件
        ui.pushButton.clicked.connect(lambda:slotFunc.Func_GetExcelPath(ui))
        ui.pushButton_2.clicked.connect(lambda:slotFunc.Func_GetLineYaml(ui))
        ui.pushButton_3.clicked.connect(lambda:slotFunc.Func_GetColumnYaml(ui))
        ui.pushButton_4.clicked.connect(slotFunc.Func_ExcelFilter)

        #文本编辑控件
        ui.lineEdit_5.textChanged.connect(slotFunc.Func_TextGet_DestSheetName)
        ui.lineEdit_4.textChanged.connect(slotFunc.Func_TextGet_NewSheetName)

        #勾选框控件
        ui.checkBox.clicked.connect(slotFunc.Func_IntegerGet_ColumnPriority)

        # text browser窗口-重定向到print函数
        package_sys.stdout = TextBrowserStream(ui.textBrowser)
        
        #设置窗口名称并显示
        Form.setWindowTitle("Excel Filter V1.0")
        Form.adjustSize()
        if package_sys.platform.startswith('win'):
            app.setStyle(QtWidgets.QStyleFactory.create('fusion'))
        Form.show()
        package_sys.exit(app.exec_())

TextBrowserStream

class TextBrowserStream(QtCore.QTextStream):
    def __init__(self, textBrowser):
        super().__init__()
        self.textBrowser = textBrowser

    #输出重定向
    def write(self, s):
        self.textBrowser.moveCursor(QtGui.QTextCursor.End)
        self.textBrowser.insertPlainText(s)
        self.textBrowser.ensureCursorVisible()
        QtWidgets.QApplication.processEvents() #必须加上这一句才能实现逐步写入
        
if __name__ == "__main__":     
    sys.stdout = TextBrowserStream(ui.textBrowser)

 错误提示

raise错误后会自动弹窗

ERROR_DIALOG = None
def Func_SysExceptionHook(exc_type, exc_value, exc_traceback):
    import traceback
    global ERROR_DIALOG
    """全局异常处理函数"""
    # traceback.print_exception(exc_type, exc_value, exc_traceback) 不显示堆栈信息
    
    error_msg = f"错误类型: {exc_type.__name__}\n错误信息: {str(exc_value)}"
    
    # 复用或创建对话框
    if ERROR_DIALOG is None:
        ERROR_DIALOG = QtWidgets.QMessageBox()
        ERROR_DIALOG.setWindowTitle("程序错误")
        ERROR_DIALOG.setIcon(QtWidgets.QMessageBox.Critical)
        ERROR_DIALOG.setStandardButtons(QtWidgets.QMessageBox.Ok)
    
    ERROR_DIALOG.setText(error_msg)
    ERROR_DIALOG.show()  # 非模态显示
    
    
if __name__ == "__main__":
    package_sys.excepthook = Func_SysExceptionHook

 

posted @ 2025-07-13 11:04  张一默  阅读(8)  评论(0)    收藏  举报