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


    继续建设自定义的部件,这次是项目选择器(类似于QRadioButton)。

    MySelectorBox.py:

    1. # 自定义的多选框
    2. from PyQt5.QtWidgets import QGroupBox
    3. from PyQt5.Qt import pyqtSignal
    4. class MySelectorBox(QGroupBox):
    5. def __init__(self, parent=None):
    6. super().__init__(parent)
    7. self.controls_clicked_style = None
    8. self.controls_enter_style = None
    9. self.start_on = 0
    10. self.controls_normal_style = None
    11. self.states_off_style = None
    12. self.states_on_style = None
    13. self.controls = []
    14. self.states = []
    15. def init(self): # 一个典型的初始化范例,需要在部件初始化的时候运行一次
    16. # self.controls =[form0.selector1.control0, form0.selector1.control1] # 这两行代码要更换成应用中实际的项目
    17. # self.states = [form0.selector1.state0, form0.selector1_state1] # 这两行代码要更换成应用中实际的项目
    18. self.controls_normal_style = 'color: #e6e6e6;background-color: rgba(255, 255, 255, 0);border-radius:2px;border:0px solid #1e2557;' # 默认控制器常态style
    19. self.controls_enter_style = 'color: #e6e6e6;background-color: rgba(255, 255, 255, 0);border-radius:2px;border:1px solid #e6e6e6;' # 默认控制器鼠标悬停style
    20. self.controls_clicked_style = 'color: #e6e6e6;background-color: rgba(255, 255, 255, 0);border-radius:2px;border:1px solid #039806;' # 默认控制器鼠标点击style
    21. self.states_on_style = 'border:2px solid rgb(43, 78, 140);background-color:#4b5075;border-radius:2px;' # 默认on状态style
    22. self.states_off_style = 'border:2px solid rgb(43, 78, 140);background-color:#039806;border-radius:2px;' # 默认off状态style
    23. self.control_init()
    24. self.state_init()
    25. def state_init(self): # 状态指示灯的初始化
    26. for i in range(len(self.states)):
    27. if i == self.start_on:
    28. self.states[i].setStyleSheet(self.states_on_style)
    29. else:
    30. self.states[i].setStyleSheet(self.states_off_style)
    31. def control_init(self): # 控制器的初始化
    32. for i in self.controls:
    33. i.style_normal = self.controls_normal_style
    34. i.style_enter = self.controls_enter_style
    35. i.style_clicked = self.controls_clicked_style

     main.py:

    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. lamp.border_color = '#2b4e8c' # 默认的边框颜色
    24. @staticmethod
    25. def red_lamp_init(lamp): # 红色指示灯
    26. lamp.rad = str(round(lamp.width() / 2))
    27. lamp.off_color = '#767676' # 默认off颜色
    28. lamp.on_color = '#da1c1c' # 默认on颜色
    29. lamp.border_color = '#2b4e8c' # 默认的边框颜色
    30. @staticmethod
    31. def normal_label_init(label): # 通常标签的初始化
    32. label.isEntered = False # 鼠标焦点是否在内
    33. label.style_normal = 'background-color:#000d47;border:2px solid #4b5075;border-radius:8px;color:#f3da83;' # 常态style
    34. label.style_enter = 'background-color:#4b5075;border-radius:8px;border:3px solid #e6e6e6;color:#e6e6e6;' # 鼠标悬停后的style
    35. label.style_clicked = 'background-color:#4b5075;border:2px solid #039806;border-radius:8px;color:#e6e6e6;' # 鼠标点击后的style
    36. @staticmethod
    37. def normal_selector_init(selector): # 通常选择器的初始化
    38. selector.start_on = 0 # 启动时状态为on的状态编号
    39. selector.controls_normal_style = 'color: #e6e6e6;background-color: rgba(255, 255, 255, 0);border-radius:2px;border:0px solid rgba(255, 255, 255, 0);' # 默认控制器常态style
    40. selector.controls_enter_style = 'color: #e6e6e6;background-color: rgba(255, 255, 255, 0);border-radius:2px;border:1px solid rgba(255, 255, 255, 0);' # 默认控制器鼠标悬停style
    41. selector.controls_clicked_style = 'color: #e6e6e6;background-color: rgba(255, 255, 255, 0);border-radius:2px;border:1px solid #039806;' # 默认控制器鼠标点击style
    42. selector.states_off_style = 'border:2px solid #2b4e8c;background-color:#4b5075;border-radius:2px;' # 默认off状态style
    43. selector.states_on_style = 'border:2px solid #2b4e8c;background-color:#039806;border-radius:2px;' # 默认on状态style
    44. selector.state_init() # 初始化状态指示灯
    45. selector.control_init() # 初始化控制器
    46. ############################################
    47. # 画面的类,每个画面对应一个同名的首字母大写的类
    48. class Form0: # 画面form0的类(form0是主窗口)
    49. def __init__(self):
    50. self.items = [form0.btn_exit, form0.btn_setting, form0.btn_user, form0.btn_history,
    51. form0.lamp_working_1, form0.label_setting_1, form0.selector_1] # form0的所有部件
    52. self.Classes = [self.Btn_exit(), self.Btn_setting(), self.Btn_user(), self.Btn_history(),
    53. self.Lamp_working_1(), self.Label_setting_1(), self.Selector_1()] # self的所有部件的类
    54. form0.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) # 关掉边框,始终最前
    55. form0.menuBar().setVisible(False) # 关闭顶部菜单栏
    56. form0.statusBar().setVisible(False) # 关闭底部状态栏
    57. form0.show() # 主画面显示
    58. # 画面中的部件的类,每个部件对应一个同名的首字母大写的类
    59. class Btn_exit: # “退出系统”按钮对应的类
    60. def __init__(self):
    61. PublicFunction.normal_button_init(form0.btn_exit) # 引用通常规格按钮的初始化
    62. form0.btn_exit.Clicked.connect(self.clicked)
    63. def clicked(self): # “退出系统”按钮点击后的操作
    64. for f in forms: # 关闭所有窗口
    65. f.close()
    66. class Btn_setting: # “参数设置”按钮对应的类
    67. def __init__(self):
    68. PublicFunction.normal_button_init(form0.btn_setting) # 引用通常规格按钮的初始化
    69. class Btn_user: # “用户管理”按钮对应的类
    70. def __init__(self):
    71. PublicFunction.normal_button_init(form0.btn_user) # 引用通常规格按钮的初始化
    72. class Btn_history: # “历史数据”按钮对应的类
    73. def __init__(self):
    74. PublicFunction.normal_button_init(form0.btn_history) # 引用通常规格按钮的初始化
    75. class Lamp_working_1: # “工作指示1”指示灯对应的类
    76. def __init__(self):
    77. PublicFunction.green_lamp_init(form0.lamp_working_1) # 初始化为绿色指示灯
    78. form0.lamp_working_1.color_on_bool(True) # 初始化为on状态
    79. class Label_setting_1: # “设置流量”标签对应的类
    80. def __init__(self):
    81. PublicFunction.normal_label_init(form0.label_setting_1) # 引用通常规格标签的初始化
    82. form0.label_setting_1.DoubleClicked.connect(self.double_clicked)
    83. def double_clicked(self):
    84. form_setting.move(form0.label_setting_1.pos()) # 将数据设置画面移动至标签所在位置
    85. form_setting.label_setting.setText(form0.label_setting_1.text()) # 将标签内容显示在设置画面的设置标签内
    86. form_setting.show() # 显示设置画面
    87. Form_setting.Btn_OK.todo = self.todo1 # 定义数据设置画面“确定”按钮按下后执行的函数
    88. def todo1(self): # 定义数据设置画面“确定”按钮按下后执行的函数
    89. form0.label_setting_1.setText(form_setting.label_setting.text())
    90. class Selector_1:
    91. def __init__(self):
    92. # form0.selector_1.start_on = 1
    93. form0.selector_1.controls = [form0.selector1_control0, form0.selector1_control1] # 选择器们的集合
    94. form0.selector_1.states = [form0.selector1_state0, form0.selector1_state1] # 状态指示灯的集合
    95. PublicFunction.normal_selector_init(form0.selector_1) # 引用通常选择器的初始化
    96. form0.selector1_control0.LeftClicked.connect(lambda: self.left_clicked(0))
    97. form0.selector1_control1.LeftClicked.connect(lambda: self.left_clicked(1))
    98. def left_clicked(self, n):
    99. for i in range(len(form0.selector_1.states)):
    100. if i == n:
    101. form0.selector_1.states[i].setStyleSheet(form0.selector_1.states_on_style)
    102. else:
    103. form0.selector_1.states[i].setStyleSheet(form0.selector_1.states_off_style)
    104. class Form_setting: # 画面form_setting的类(form_setting是共用的数据设置窗口)
    105. def __init__(self): # 画面form_setting的类的初始化
    106. form_setting.setWindowFlags(Qt.WindowStaysOnTopHint) # 始终最前
    107. self.items = [form_setting.btn_OK, form_setting.btn_cancel,
    108. form_setting.label_setting] # Form_setting的所有部件
    109. self.Classes = [self.Btn_OK(), self.Btn_cancel(),
    110. self.Label_setting()] # Form_setting的所有部件的类
    111. class Btn_OK: # “确定”按钮的类
    112. todo = None # 这是一个共用的画面,todo是本画面确定键按下后将要执行的函数
    113. args = [] # todo函数的参数
    114. def __init__(self):
    115. PublicFunction.normal_button_init(form_setting.btn_OK) # 引用通常规格按钮的初始化
    116. form_setting.btn_OK.Clicked.connect(self.clicked)
    117. form_setting.btn_OK.Clicked.connect(form_setting.close)
    118. def clicked(self):
    119. self.todo(*self.args) # 点击OK后执行预置的函数
    120. class Btn_cancel: # “取消”按钮的类
    121. def __init__(self):
    122. PublicFunction.normal_button_init(form_setting.btn_cancel) # 引用通常规格按钮的初始化
    123. form_setting.btn_cancel.Clicked.connect(form_setting.close)
    124. class Label_setting: # “设定值”标签的类
    125. def __init__(self):
    126. PublicFunction.normal_label_init(form_setting.label_setting) # 引用通常规格标签的初始化
    127. ############################################
    128. # 主函数
    129. if __name__ == '__main__':
    130. app = QApplication(argv)
    131. QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # 解决显示比例不同时的部件变形问题
    132. forms = [] # 所有画面显示界面的集合
    133. form0 = uic.loadUi('../UIS/form0.ui') # 生成并加载画面,form0是主画面
    134. forms.append(form0) # 将画面加入集合
    135. Form0 = Form0() # form0对应的类是Form0,将类Form0实体化
    136. form_setting = uic.loadUi('../UIS/设定值.ui')
    137. forms.append(form_setting)
    138. Form_setting = Form_setting()
    139. exit(app.exec_())

  • 相关阅读:
    为什么企业需要视频会议私有部署?
    解决tomcat启动时的中文乱码问题
    Vue项目性能优化之---自定义指令实现图片懒加载、首屏渲染优化(组件数据懒加载)、vue-lazyload的使用
    openGauss学习笔记-130 openGauss 数据库管理-参数设置-重设参数
    二进制数据传输几个关键项记录——大小端、BCD码、CRC16校验
    CSS笔记——BFC(块级格式化上下文)
    Django模型层
    基于STM32单片机的智能窗帘系统
    电子电器架构——基于Adaptive AUTOSAR的电子电器架构简析
    Docker的网络模式
  • 原文地址:https://blog.csdn.net/xulibo5828/article/details/133552028