• 我用PYQT5做的第一个实用的上位机项目(三)


    基本的程序框架:

    因为自己不是专业的程序员,只是一个搞电气控制的“票友”,所以尽量减少手动输入 代码量,能在Qt Dsigner里面完成的组态就不要放在代码里面完成。

    在框架的建设方面,尽量做到集中和整合,位于同一画面的部件就集中在一个地方,方便中途增加和删除部件。所有的元素,可以做到“望文知义”,通过代码的组织结构能够迅速找到每一个部件的特征和动作。

    如图所示,目前阶段的框架,包含了以下:

            公共函数,里面定义了一些通用的特征,比如常规型号的按钮、指示灯。

            画面的类,目前创建了两个画面:form0( 主画面)和form_setting(设定值画面),每一个画面对应一个同名首字母大写的类,例如:form0对应的类是Form0,form_setting对应的类是Form_setting。然后在类里面,每一个需要有操作的部件,例如按钮、指示灯等,也都对应一个同名首字母大写的类,这样就可以把所有部件的操作按位置集中整合。

            以设定值画面为例,共有三个部件需要操作:btn_OK,btn_cancel,label_setting

     所以在Form_setting的函数定义里,有三个对应的子类:

     Btn_OK,Btn_cancel,Label_setting,每个部件的定义和信号连接等都位于相应的类里面:

    完整代码:

    1. from sys import exit, argv
    2. from PyQt5.QtCore import Qt, QCoreApplication, pyqtSignal
    3. from PyQt5.QtWidgets import QApplication
    4. from PyQt5 import uic
    5. import buttons # 按钮的内嵌图片资源
    6. ############################################
    7. # 公共的函数
    8. class PublicFunction: # 公共函数
    9. @staticmethod
    10. def normal_button_init(button): # 通常规格按钮的初始化
    11. button.isEntered = False # 鼠标焦点是否在内
    12. button.setImage() # 获取按钮上的图片
    13. button.style_normal = f'background-color:#4b5075;border-radius:8px;border:2px solid rgb(43, 78, 140);color:#e6e6e6;image:{button.image};' # 常态style
    14. button.style_enter = f'background-color:#4b5075;border-radius:8px;border:3px solid #e6e6e6;color:#e6e6e6;image:{button.image};' # 鼠标悬停后的style
    15. button.style_clicked = f'background-color:#4b5075;border:2px solid #039806;border-radius:8px;color:#e6e6e6;image:{button.image};' # 鼠标点击后的style
    16. button.style_on = f'background-color:#039806;border:4px solid #e6e6e6;border-radius:8px;color:#e6e6e6;image:{button.image};' # ON状态的style
    17. button.style_disable = f'background-color:#767676;border:2px solid rgb(43, 78, 140);border-radius:8px;color:#c6c6c6;image:{button.image};' # 禁用状态下的style
    18. @staticmethod
    19. def green_lamp_init(lamp): # 绿色指示灯
    20. lamp.rad = str(round(lamp.width() / 2))
    21. lamp.off_color = '#767676' # 默认off颜色
    22. lamp.on_color = '#039806' # 默认on颜色
    23. @staticmethod
    24. def red_lamp_init(lamp): # 红色指示灯
    25. lamp.rad = str(round(lamp.width() / 2))
    26. lamp.off_color = '#767676' # 默认off颜色
    27. lamp.on_color = '#da1c1c' # 默认on颜色
    28. @staticmethod
    29. def normal_label_init(label): # 通常标签的初始化
    30. label.isEntered = False # 鼠标焦点是否在内
    31. label.style_normal = 'background-color:#000d47;border:2px solid #4b5075;border-radius:8px;color:#f3da83;' # 常态style
    32. label.style_enter = 'background-color:#4b5075;border-radius:8px;border:3px solid #e6e6e6;color:#e6e6e6;' # 鼠标悬停后的style
    33. label.style_clicked = 'background-color:#4b5075;border:2px solid #039806;border-radius:8px;color:#e6e6e6;' # 鼠标点击后的style
    34. ############################################
    35. # 画面的类,每个画面对应一个同名的首字母大写的类
    36. class Form0: # 画面form0的类(form0是主窗口)
    37. def __init__(self):
    38. self.items = [form0.btn_exit, form0.btn_setting, form0.btn_user, form0.btn_history,
    39. form0.lamp_working_1, form0.label_setting_1] # form0的所有部件
    40. self.Classes = [self.Btn_exit(), self.Btn_setting(), self.Btn_user(), self.Btn_history(),
    41. self.Lamp_working_1(), self.Label_setting_1()] # self的所有部件的类
    42. form0.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) # 关掉边框,始终最前
    43. form0.menuBar().setVisible(False) # 关闭顶部菜单栏
    44. form0.statusBar().setVisible(False) # 关闭底部状态栏
    45. form0.show() # 主画面显示
    46. # 画面中的部件的类,每个部件对应一个同名的首字母大写的类
    47. class Btn_exit: # “退出系统”按钮对应的类
    48. def __init__(self):
    49. PublicFunction.normal_button_init(form0.btn_exit) # 引用通常规格按钮的初始化
    50. form0.btn_exit.Clicked.connect(self.clicked)
    51. def clicked(self): # “退出系统”按钮点击后的操作
    52. for f in forms: # 关闭所有窗口
    53. f.close()
    54. class Btn_setting: # “参数设置”按钮对应的类
    55. def __init__(self):
    56. PublicFunction.normal_button_init(form0.btn_setting) # 引用通常规格按钮的初始化
    57. class Btn_user: # “用户管理”按钮对应的类
    58. def __init__(self):
    59. PublicFunction.normal_button_init(form0.btn_user) # 引用通常规格按钮的初始化
    60. class Btn_history: # “历史数据”按钮对应的类
    61. def __init__(self):
    62. PublicFunction.normal_button_init(form0.btn_history) # 引用通常规格按钮的初始化
    63. class Lamp_working_1: # “工作指示1”指示灯对应的类
    64. def __init__(self):
    65. PublicFunction.green_lamp_init(form0.lamp_working_1) # 初始化为绿色指示灯
    66. form0.lamp_working_1.color_on_bool(True) # 初始化为on状态
    67. class Label_setting_1: # “设置流量”标签对应的类
    68. def __init__(self):
    69. PublicFunction.normal_label_init(form0.label_setting_1) # 引用通常规格标签的初始化
    70. form0.label_setting_1.DoubleClicked.connect(self.double_clicked)
    71. def double_clicked(self):
    72. form_setting.move(form0.label_setting_1.pos()) # 将数据设置画面移动至标签所在位置
    73. form_setting.label_setting.setText(form0.label_setting_1.text()) # 将标签内容显示在设置画面的设置标签内
    74. form_setting.show() # 显示设置画面
    75. Form_setting.Btn_OK.todo = self.todo1 # 定义数据设置画面“确定”按钮按下后执行的函数
    76. def todo1(self): # 定义数据设置画面“确定”按钮按下后执行的函数
    77. form0.label_setting_1.setText(form_setting.label_setting.text())
    78. class Form_setting: # 画面form_setting的类(form_setting是共用的数据设置窗口)
    79. def __init__(self): # 画面form_setting的类的初始化
    80. form_setting.setWindowFlags(Qt.WindowStaysOnTopHint) # 始终最前
    81. self.items = [form_setting.btn_OK, form_setting.btn_cancel,
    82. form_setting.label_setting] # Form_setting的所有部件
    83. self.Classes = [self.Btn_OK(), self.Btn_cancel(),
    84. self.Label_setting()] # Form_setting的所有部件的类
    85. class Btn_OK: # “确定”按钮的类
    86. todo = None # 这是一个共用的画面,todo是本画面确定键按下后将要执行的函数
    87. args = [] # todo函数的参数
    88. def __init__(self):
    89. PublicFunction.normal_button_init(form_setting.btn_OK) # 引用通常规格按钮的初始化
    90. form_setting.btn_OK.Clicked.connect(self.clicked)
    91. form_setting.btn_OK.Clicked.connect(form_setting.close)
    92. def clicked(self):
    93. self.todo(*self.args) # 点击OK后执行预置的函数
    94. class Btn_cancel: # “取消”按钮的类
    95. def __init__(self):
    96. PublicFunction.normal_button_init(form_setting.btn_cancel) # 引用通常规格按钮的初始化
    97. form_setting.btn_cancel.Clicked.connect(form_setting.close)
    98. class Label_setting: # “设定值”标签的类
    99. def __init__(self):
    100. PublicFunction.normal_label_init(form_setting.label_setting) # 引用通常规格标签的初始化
    101. ############################################
    102. # 主函数
    103. if __name__ == '__main__':
    104. app = QApplication(argv)
    105. QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # 解决显示比例不同时的部件变形问题
    106. forms = [] # 所有画面显示界面的集合
    107. form0 = uic.loadUi('../UIS/form0.ui') # 生成并加载画面,form0是主画面
    108. forms.append(form0) # 将画面加入集合
    109. Form0 = Form0() # form0对应的类是Form0,将类Form0实体化
    110. form_setting = uic.loadUi('../UIS/设定值.ui')
    111. forms.append(form_setting)
    112. Form_setting = Form_setting()
    113. exit(app.exec_())

     运行截图:

  • 相关阅读:
    IE URL传参问题
    CCAA 信息安全管理体系 考试大纲及重点题目记忆
    性能测试——系统性能数据收集和Prometheus 监控系统部署应用实战
    Datagrip 下载、安装教程,详细图文,亲测有效
    K8s复习笔记11--dubbo架构
    C++的流和文件介绍
    qt槽函数的四种写法
    项目部署Linux步骤
    【PAT(甲级)】1069 The Black Hole of Numbers(易错点)
    【★★★★★ 第6章 图总结笔记 2022 9.13】
  • 原文地址:https://blog.csdn.net/xulibo5828/article/details/133514330