【二】从小白开始使用Python一步一步搭建一个深度学习UI界面【界面设计】
这里提供了界面控件设计的相关代码
·
本来是想使用Qt Designer进行界面控件拖拽的方式进行界面设计的,但是后来觉得这样后面维护更新起来太麻烦了,就还是使用纯代码来写界面吧,这需要一定的想象能力。
设计界面
pyqt外部工具添加
在设置界面搜索“外部工具”,这里我已经添加了两个QT Designer的外部工具,一个是用于创建ui文件的,另一个是用于编辑ui文件的。
点击加号,按照这个参数添加两个工具。程序路径是电脑中安装的qt路径,如果没有安装qt的话,可以参考网上其他的方法,例如:配置Qt Designer到PyCharm。

程序:
选择自己环境下的python.exe
我的是anaconda的 D:\ProgramData\anaconda3\python.exe
实参:
-m PyQt5.uic.pyuic F i l e N a m e FileName FileName -o F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension.py -x
工作目录:
F i l e D i r FileDir FileDir
创建界面
import os
import sys
import winreg
from PyQt5.QtCore import QThread, pyqtSlot
from PyQt5.QtCore import Qt, QMetaObject, QCoreApplication
from PyQt5.QtWidgets import QVBoxLayout, QWidget, QGridLayout, QLineEdit, QPushButton, QMainWindow, QTabWidget, QToolBar, QStatusBar, QAction, QComboBox, QLabel, QHBoxLayout, QTableWidget, QTextEdit, QProgressBar, QTableWidgetItem, QCheckBox, \
QHeaderView, QFileDialog, QApplication
Config_Parameters = [
{'ID': 'input_shape', '名称': '输入尺寸', '取值范围': None, '默认值': [256, 256], '说明': '输入图像的尺寸。', '控件类型': 'LineEdit'},
{'ID': 'Cuda', '名称': 'CUDA加速', '取值范围': [True, False], '默认值': True, '说明': '是否使用CUDA进行加速。', '控件类型': 'CheckBox'},
{'ID': 'seed', '名称': '随机种子', '取值范围': None, '默认值': 11, '说明': '随机种子,使得每次独立训练都可以获得一样的结果。', '控件类型': 'LineEdit'},
{'ID': 'fp16', '名称': '混合精度训练', '取值范围': [True, False], '默认值': False, '说明': '是否使用混合精度训练,可减少约一半的显存。', '控件类型': 'CheckBox'},
{'ID': 'num_classes', '名称': '类别数量', '取值范围': None, '默认值': 2, '说明': '标签的总类别数,自己需要的分类个数+1,如2+1。', '控件类型': 'LineEdit'},
# {'ID': 'backbone', '名称': '主干网络', '取值范围': ['mobilenet', 'xception', 'vgg', 'resnet50'], '默认值': 'mobilenet', '说明': '模型的主干网络。', '控件类型': 'ComboBox'},
{'ID': 'pretrained', '名称': '预训练模型', '取值范围': [True, False], '默认值': False, '说明': '是否使用预训练模型,如果设置了model_path,则主干的权值无需加载,pretrained的值无意义。', '控件类型': 'CheckBox'},
{'ID': 'model_path', '名称': '预训练模型路径', '取值范围': None, '默认值': './model_data/deeplab_mobilenetv2.pth', '说明': '预训练模型的文件名,放在model_data文件夹内。', '控件类型': 'LineEdit'},
{'ID': 'save_period', '名称': '模型保存周期', '取值范围': None, '默认值': 5, '说明': '表示多少个epoch保存一次权值。', '控件类型': 'LineEdit'},
{'ID': 'save_dir', '名称': '存储路径', '取值范围': None, '默认值': 'logs', '说明': '模型权值与日志文件保存的文件夹。', '控件类型': 'LineEdit'},
{'ID': 'downsample_factor', '名称': '下采样因子', '取值范围': [16, 8], '默认值': 16, '说明': '特征图的下采样因子,8下采样的倍数较小、理论上效果更好,但也要求更大的显存。', '控件类型': 'ComboBox'},
{'ID': 'Init_Epoch', '名称': '初始训练轮数', '取值范围': None, '默认值': 0, '说明': '初始化训练的轮数,从第几个周期开始训练。', '控件类型': 'LineEdit'},
{'ID': 'Freeze_Train', '名称': '冻结训练', '取值范围': [True, False], '默认值': True, '说明': '是否进行冻结训练,在显卡非常差的情况下,可设置Freeze_Epoch等于UnFreeze_Epoch,此时仅仅进行冻结训练。', '控件类型': 'CheckBox'},
{'ID': 'Freeze_Epoch', '名称': '冻结训练轮数', '取值范围': None, '默认值': 50, '说明': '模型冻结训练的Freeze_Epoch。', '控件类型': 'LineEdit'},
{'ID': 'Freeze_batch_size', '名称': '冻结训练批次大小', '取值范围': None, '默认值': 2, '说明': '冻结训练的批次大小,正常情况下Freeze_batch_size建议为Unfreeze_batch_size的1-2倍。', '控件类型': 'LineEdit'},
{'ID': 'UnFreeze_Epoch', '名称': '解冻训练轮数', '取值范围': None, '默认值': 100, '说明': '模型总共训练的epoch。', '控件类型': 'LineEdit'},
{'ID': 'UnFreeze_batch_size', '名称': '解冻训练批次大小', '取值范围': None, '默认值': 2, '说明': '解冻训练的批次大小,batch_size最小为2,不能为1。', '控件类型': 'LineEdit'},
{'ID': 'Init_lr', '名称': '初始学习率', '取值范围': None, '默认值': 5e-5, '说明': '模型的最大学习率,建议:当使用Adam优化器5e-4,当使用SGD优化器=7e-3。', '控件类型': 'LineEdit'},
{'ID': 'Min_lr', '名称': '最小学习率', '取值范围': None, '默认值': 5e-7, '说明': '模型的最小学习率,默认为初始学习率的0.01。', '控件类型': 'LineEdit'},
{'ID': 'optimizer_type', '名称': '优化器类型', '取值范围': ['sgd', 'adam'], '默认值': 'sgd', '说明': '优化器类型,sgd适用于大规模数据集;adam适用于处理具有不同特征尺度的问题。', '控件类型': 'ComboBox'},
{'ID': 'momentum', '名称': '动量参数', '取值范围': None, '默认值': 0.9, '说明': '动量参数,用于改进梯度下降算法的收敛性和稳定性。', '控件类型': 'LineEdit'},
{'ID': 'weight_decay', '名称': '权重衰减值', '取值范围': None, '默认值': 1e-4, '说明': '权值衰减,可防止过拟合,使用adam时建议设置为0。', '控件类型': 'LineEdit'},
{'ID': 'lr_decay_type', '名称': '学习率衰减类型', '取值范围': ['step', 'cos'], '默认值': 'step', '说明': '使用到的学习率下降方式,可选的有step、cos。', '控件类型': 'ComboBox'},
{'ID': 'eval_flag', '名称': '评估标志', '取值范围': [True, False], '默认值': True, '说明': '是否在训练时进行评估,评估对象为验证集。', '控件类型': 'CheckBox'},
{'ID': 'eval_period', '名称': '评估周期', '取值范围': None, '默认值': 5, '说明': '代表多少个epoch评估一次,评估需要消耗较多的时间,频繁评估会导致训练非常慢。', '控件类型': 'LineEdit'},
{'ID': 'dice_loss', '名称': '启用Dice Loss', '取值范围': [True, False], '默认值': False, '说明': '是否使用dice Loss,处理前景和背景类别不平衡的问题。', '控件类型': 'CheckBox'},
{'ID': 'focal_loss', '名称': '启用Focal Loss', '取值范围': [True, False], '默认值': False, '说明': '是否使用focal loss,处理类别不平衡和难易样本不平衡的问题。', '控件类型': 'CheckBox'},
{'ID': 'num_workers', '名称': '并行核心工作数', '取值范围': None, '默认值': 0, '说明': '用于设置是否使用多线程读取数据,1代表关闭多线程,开启后会加快数据读取速度,但是会占用更多内存。', '控件类型': 'LineEdit'},
{'ID': 'aux_branch', '名称': '启用辅助分支', '取值范围': [True, False], '默认值': False, '说明': '用于PSPNet,是否使用辅助分支,会占用大量显存。', '控件类型': 'CheckBox'},
{'ID': 'distributed', '名称': '分布式训练', '取值范围': [True, False], '默认值': False, '说明': '是否使用分布式训练,用于指定是否使用单机多卡分布式运行。', '控件类型': 'CheckBox'},
{'ID': 'sync_bn', '名称': '同步批量归一化', '取值范围': [True, False], '默认值': False, '说明': '是否同步使用Batch Normalization,DDP模式多卡可用,Windows系统下默认使用DP模式调用所有显卡,不支持DDP。', '控件类型': 'CheckBox'},
{'ID': 'anchors_size', '名称': '先验框的大小。', '取值范围': None, '默认值': [8, 16, 32], '说明': '用于设定先验框的大小,每个特征点均存在9个先验框。如果想要检测小物体,可以减小靠前的值', '控件类型': 'LineEdit'},
# 添加更多参数...
]
NetworkTypeParams = [
{
"ID": "图像分类",
"Ranges": [
{"NetworkType": "AlexNet", "Version": ["none"], "Backbones": ["none"]},
{"NetworkType": "DenseNet", "Version": ["121", "169", "201"], "Backbones": ["none"]},
{"NetworkType": "GhostNet", "Version": ["none"], "Backbones": ["none"]},
{"NetworkType": "GoogleNet", "Version": ["none"], "Backbones": ["none"]},
{"NetworkType": "MobileNet", "Version": ["v2", "v3"], "Backbones": ["none"]},
{"NetworkType": "ResNet", "Version": ["18", "34", "50", "101", "152"], "Backbones": ["none"]},
{"NetworkType": "ShuffleNet", "Version": ["_g1", "_g2", "_v2_x0_5", "_v2_x1_0", "_v2_x1_5", "_v2_x2_0"], "Backbones": ["none"]},
{"NetworkType": "Swin_Transformer", "Version": ["_tiny", "_small", "_base"], "Backbones": ["none"]},
{"NetworkType": "VGGNet", "Version": ["11", "13", "16", "19", "11_bn", "13_bn", "16_bn", "19_bn"], "Backbones": ["none"]},
{"NetworkType": "Vision_Transformer", "Version": ["_vit_b_16"], "Backbones": ["none"]},
{"NetworkType": "Inception", "Version": ["1.0", "2.0"], "Backbones": ["none"]},
{"NetworkType": "SqueezeNet", "Version": ["1.0", "1.1"], "Backbones": ["none"]},
{"NetworkType": "EfficientNet", "Version": ["B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7"], "Backbones": ["none"]}
],
"默认值": {"NetworkType": "AlexNet", "Version": "none", "Backbones": ["none"]}
},
{
"ID": "目标检测",
"Ranges": [
{"NetworkType": "YOLO", "Version": ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8"], "Backbones": ["none"]},
{"NetworkType": "FasterRCNN", "Version": ["none"], "Backbones": ["vgg", "resnet50"]},
{"NetworkType": "SSD300", "Version": ["none"], "Backbones": ["vgg", "resnet50", 'mobilenetv2']},
{"NetworkType": "RetinaNet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "R-FCN", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "CornerNet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "CenterNet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "Other", "Version": ["1.0"], "Backbones": ["none"]}
],
"默认值": {"NetworkType": "YOLO", "Version": "v1", "Backbones": ["none"]}
},
{
"ID": "语义分割",
"Ranges": [
{"NetworkType": "DeepLab", "Version": ["none"], "Backbones": ["mobilenet", "xception"]},
{"NetworkType": "UNet", "Version": ["none"], "Backbones": ["vgg16", "resnet50"]},
{"NetworkType": "FCN", "Version": ["none"], "Backbones": ["resnet34", "vgg16"]},
{"NetworkType": "PSPNet", "Version": ["none"], "Backbones": ["mobilenet", "resnet50"]},
{"NetworkType": "SegNet", "Version": ["none"], "Backbones": ["none"]},
{"NetworkType": "HRNet", "Version": ["none"], "Backbones": ["none"]},
{"NetworkType": "DANet", "Version": ["none"], "Backbones": ["none"]},
{"NetworkType": "Other", "Version": ["none"], "Backbones": ["none"]}
],
"默认值": {"NetworkType": "DeepLab", "Version": "3.0+", "Backbones": ["none"]}
},
{
"ID": "实例分割",
"Ranges": [
{"NetworkType": "Mask R-CNN", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "FCIS", "Version": ["2.0"], "Backbones": ["none"]},
{"NetworkType": "HTC", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "BlendMask", "Version": ["2.0"], "Backbones": ["none"]},
{"NetworkType": "PolarMask", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "YOLACT", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "Other", "Version": ["1.0"], "Backbones": ["none"]}
],
"默认值": {"NetworkType": "Mask R-CNN", "Version": "1.0", "Backbones": ["none"]}
}
]
class MainCode(QMainWindow): # 继承自MainUI.Ui_MainUI类,从ui文件中编译而来
desktop_path = CommonHelper.get_desktop()
def __init__(self):
QMainWindow.__init__(self)
self.Thread_SignalStation = None
self.progressBar = None
self.loginfo_textEdit = None
self.Parameters_tableWidget = None
self.Bottom_Layout = None
self.root_folder_label = None
self.network_names_comboBox = None
self.root_folder_edit = None
self.split_folder_button = None
self.application_tasks_label = None
self.network_versions_comboBox = None
self.network_backbones_comboBox = None
self.network_names_label = None
self.split_folder_label = None
self.label_folder_label = None
self.network_versions_label = None
self.images_folder_label = None
self.network_backbone_label = None
self.split_folder_edit = None
self.tasks_comboBox = None
self.images_folder_button = None
self.images_folder_edit = None
self.root_folder_button = None
self.label_folder_button = None
self.label_folder_edit = None
self.layout_tab_1_top = None
self.tab_3 = None
self.layout_tab_2 = None
self.tab_2 = None
self.layout_tab_1 = None
self.tab_1 = None
self.layout_tab_0 = None
self.tab_0 = None
self.debug_action = None
self.stop_action = None
self.run_action = None
self.statusbar = None
self.toolbar = None
self.tabWidget = None
self.mainlayout = None
self.centralwidget = None
self.setupUi()
self.thread = None # 主线程对象
self.worker = None # 任务对象
self.setup_signal()
# ---------------------------------#
# 设置初始化参数
# ---------------------------------#
self.InitParametersTable()
self.InitParameters()
def setupUi(self):
self.setWindowTitle("Deep Learning UI")
self.setObjectName("MainUI")
self.resize(1280, 800)
self.centralwidget = QWidget(self)
self.centralwidget.setObjectName("centralwidget")
self.mainlayout = QVBoxLayout(self.centralwidget)
self.tabWidget = QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.mainlayout.addWidget(self.tabWidget)
self.setup_tabWidget()
self.setCentralWidget(self.centralwidget)
self.toolbar = QToolBar(self)
self.toolbar.setMovable(False)
self.toolbar.setObjectName("toolbar")
self.addToolBar(Qt.TopToolBarArea, self.toolbar)
self.statusbar = QStatusBar(self)
self.statusbar.setObjectName("statusbar")
self.setStatusBar(self.statusbar)
self.run_action = QAction('运行')
self.run_action.setObjectName("run_action")
self.stop_action = QAction('停止')
self.stop_action.setObjectName("stop_action")
self.debug_action = QAction('调试')
self.debug_action.setObjectName("debug_action")
self.toolbar.addActions([self.run_action, self.stop_action, self.debug_action])
self.images_folder_label.setBuddy(self.images_folder_edit)
self.label_folder_label.setBuddy(self.label_folder_edit)
self.split_folder_label.setBuddy(self.split_folder_edit)
self.root_folder_label.setBuddy(self.root_folder_edit)
self.tabWidget.setCurrentIndex(1)
QMetaObject.connectSlotsByName(self)
def setup_tabWidget(self):
self.tab_0 = QWidget()
self.layout_tab_0 = QVBoxLayout(self.tab_0)
self.layout_tab_0.setObjectName("layout_tab_0")
self.tabWidget.addTab(self.tab_0, "拆分")
self.tab_1 = QWidget()
self.layout_tab_1 = QVBoxLayout(self.tab_1)
self.layout_tab_1.setObjectName("layout_tab_1")
self.tabWidget.addTab(self.tab_1, "设置")
self.layout_tab_1_top = QGridLayout()
self.layout_tab_1_top.setColumnStretch(0, 1)
self.layout_tab_1_top.setColumnStretch(1, 2)
self.layout_tab_1_top.setColumnStretch(2, 1)
self.layout_tab_1_top.setColumnStretch(3, 6)
self.layout_tab_1_top.setColumnStretch(4, 1)
self.layout_tab_1.addLayout(self.layout_tab_1_top)
self.application_tasks_label = QLabel('深度学习方法')
self.application_tasks_label.setObjectName("application_tasks_label")
self.layout_tab_1_top.addWidget(self.application_tasks_label, 0, 0, 1, 1)
self.tasks_comboBox = QComboBox(self.tab_1)
self.tasks_comboBox.setCurrentText("")
self.tasks_comboBox.setObjectName("tasks_comboBox")
self.layout_tab_1_top.addWidget(self.tasks_comboBox, 0, 1, 1, 1)
self.network_names_label = QLabel('网络名称')
self.network_names_label.setObjectName("network_names_label")
self.layout_tab_1_top.addWidget(self.network_names_label, 1, 0, 1, 1)
self.network_names_comboBox = QComboBox(self.tab_1)
self.network_names_comboBox.setObjectName("network_names_comboBox")
self.layout_tab_1_top.addWidget(self.network_names_comboBox, 1, 1, 1, 1)
self.network_versions_label = QLabel('模型版本')
self.network_versions_label.setObjectName("network_versions_label")
self.layout_tab_1_top.addWidget(self.network_versions_label, 2, 0, 1, 1)
self.network_versions_comboBox = QComboBox(self.tab_1)
self.network_versions_comboBox.setObjectName("network_versions_comboBox")
self.layout_tab_1_top.addWidget(self.network_versions_comboBox, 2, 1, 1, 1)
self.network_backbone_label = QLabel('骨干网络')
self.network_backbone_label.setObjectName("network_backbone_label")
self.layout_tab_1_top.addWidget(self.network_backbone_label, 3, 0, 1, 1)
self.network_backbones_comboBox = QComboBox(self.tab_1)
self.network_backbones_comboBox.setObjectName("network_backbones_comboBox")
self.layout_tab_1_top.addWidget(self.network_backbones_comboBox, 3, 1, 1, 1)
self.root_folder_label = QLabel('项目根目录')
self.root_folder_label.setLayoutDirection(Qt.LeftToRight)
self.layout_tab_1_top.addWidget(self.root_folder_label, 0, 2, 1, 1)
self.root_folder_edit = QLineEdit(self.tab_1)
self.root_folder_edit.setObjectName("root_folder_edit")
self.layout_tab_1_top.addWidget(self.root_folder_edit, 0, 3, 1, 1)
self.images_folder_label = QLabel('源图路径')
self.images_folder_label.setObjectName("images_folder_label")
self.layout_tab_1_top.addWidget(self.images_folder_label, 1, 2, 1, 1)
self.images_folder_edit = QLineEdit(self.tab_1)
self.images_folder_edit.setText('Images')
self.images_folder_edit.setObjectName("images_folder_edit")
self.layout_tab_1_top.addWidget(self.images_folder_edit, 1, 3, 1, 1)
self.label_folder_label = QLabel('标注图像路径')
self.label_folder_label.setObjectName("label_folder_label")
self.layout_tab_1_top.addWidget(self.label_folder_label, 2, 2, 1, 1)
self.label_folder_edit = QLineEdit(self.tab_1)
self.label_folder_edit.setText('SegImages')
self.label_folder_edit.setObjectName("label_folder_edit")
self.layout_tab_1_top.addWidget(self.label_folder_edit, 2, 3, 1, 1)
self.split_folder_label = QLabel('类别划分文件路径')
self.split_folder_label.setObjectName("split_folder_label")
self.layout_tab_1_top.addWidget(self.split_folder_label, 3, 2, 1, 1)
self.split_folder_edit = QLineEdit(self.tab_1)
self.split_folder_edit.setText('Annotation')
self.split_folder_edit.setObjectName("split_folder_edit")
self.layout_tab_1_top.addWidget(self.split_folder_edit, 3, 3, 1, 1)
self.root_folder_button = QPushButton('选择路径')
self.root_folder_button.setObjectName("root_folder_button")
self.layout_tab_1_top.addWidget(self.root_folder_button, 0, 4, 1, 1)
self.images_folder_button = QPushButton('选择文件夹')
self.images_folder_button.setObjectName("images_folder_button")
self.layout_tab_1_top.addWidget(self.images_folder_button, 1, 4, 1, 1)
self.label_folder_button = QPushButton('选择文件夹')
self.label_folder_button.setObjectName("label_folder_button")
self.layout_tab_1_top.addWidget(self.label_folder_button, 2, 4, 1, 1)
self.split_folder_button = QPushButton('选择文件夹')
self.split_folder_button.setObjectName("split_folder_button")
self.layout_tab_1_top.addWidget(self.split_folder_button, 3, 4, 1, 1)
self.Parameters_tableWidget = QTableWidget(self.tab_1)
self.Parameters_tableWidget.setObjectName("Parameters_tableWidget")
self.Parameters_tableWidget.setColumnCount(0)
self.Parameters_tableWidget.setRowCount(0)
self.layout_tab_1.addWidget(self.Parameters_tableWidget)
self.layout_tab_1.setStretch(1, 9)
self.tab_2 = QWidget()
self.layout_tab_2 = QVBoxLayout(self.tab_2)
self.layout_tab_2.setObjectName("layout_tab_2")
self.tabWidget.addTab(self.tab_2, "训练记录")
self.loginfo_textEdit = QTextEdit(self.tab_2)
self.loginfo_textEdit.setObjectName("loginfo_textEdit")
self.layout_tab_2.addWidget(self.loginfo_textEdit)
self.progressBar = QProgressBar(self.tab_2)
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName("progressBar")
self.layout_tab_2.addWidget(self.progressBar)
self.layout_tab_2.setStretch(0, 1)
self.tab_3 = QWidget()
self.tabWidget.addTab(self.tab_3, "预测")
def setup_signal(self):
# ---------------------------------#
# 设置信号连接 只能在一个地方设置连接,否则会出现一个信号多次触发的问题
# ---------------------------------#
self.root_folder_button.clicked.connect(self.slot_set_root_folder)
self.images_folder_button.clicked.connect(self.slot_set_sub_folder)
self.label_folder_button.clicked.connect(self.slot_set_sub_folder)
self.tasks_comboBox.currentIndexChanged.connect(self.on_tasks_comboBox_index_changed)
self.network_names_comboBox.currentIndexChanged.connect(self.on_network_names_comboBox_index_changed)
self.network_versions_comboBox.currentIndexChanged.connect(self.on_network_versions_comboBox_index_changed)
self.network_backbones_comboBox.currentIndexChanged.connect(self.on_network_backbones_comboBox_index_changed)
self.run_action.triggered.connect(self.slot_startTask)
self.stop_action.triggered.connect(self.slot_stopTask)
self.debug_action.triggered.connect(self.slot_debug)
self.Thread_SignalStation = SignalStation()
# 连接信号站发出的信号
self.Thread_SignalStation.send_msg.connect(self.slot_print)
self.Thread_SignalStation.send_progress.connect(self.update_progressBar)
def InitParameters(self):
self.root_folder_edit.setText(self.desktop_path)
self.root_folder_edit.setText(r'E:\Desktop\Learning\HalconToVOC\VOC_TreadROI_G5')
self.loginfo_textEdit.setStyleSheet("border-image:url(Background.jpg) 0 0 0 0 stretch stretch; background-color: lightgray;")
self.loginfo_textEdit.append(errorFormat.format('This is error text')) # 该内容显示为红色
self.loginfo_textEdit.append(warningFormat.format('This is warning text')) # 该内容显示为橙色
self.loginfo_textEdit.append(validFormat.format('This is a valid text')) # 该内容显示为蓝色
self.tasks_comboBox.addItems([task["ID"] for task in NetworkTypeParams])
self.tasks_comboBox.setCurrentIndex(2)
# self.network_names_comboBox.addItems([name["NetworkType"] for name in [item['Ranges'] for item in self.NetworkTypeParams][0]])
# self.network_names_comboBox.addItems([name["NetworkType"] for name in [item['Ranges'] for item in self.NetworkTypeParams][0]])
def InitParametersTable(self):
# 创建参数表格
table = self.Parameters_tableWidget
table.setColumnCount(3) # 设置列数
table.setHorizontalHeaderLabels(['参数名称', '参数取值', '参数说明'])
table.setRowCount(len(Config_Parameters))
for i, parameter in enumerate(Config_Parameters):
name_item = QTableWidgetItem(parameter['名称'])
table.setItem(i, 0, name_item)
control_type = parameter['控件类型']
if control_type == 'ComboBox':
combo_box = QComboBox(self)
combo_box.addItems([str(value) for value in parameter['取值范围']])
# combo_box.currentIndexChanged.connect(self.on_ParametersTable_ValueChanged)
combo_box.setCurrentText(str(parameter['默认值']))
table.setCellWidget(i, 1, combo_box)
elif control_type == 'CheckBox':
check_box = QCheckBox(self)
check_box.setChecked(bool(parameter['默认值']))
# check_box.stateChanged.connect(self.on_ParametersTable_ValueChanged)
table.setCellWidget(i, 1, check_box)
elif control_type == 'LineEdit':
line_edit = QLineEdit(self)
line_edit.setText(str(parameter['默认值']))
# line_edit.textChanged.connect(self.on_ParametersTable_ValueChanged)
table.setCellWidget(i, 1, line_edit)
elif control_type == 'PushButton':
push_button = QPushButton(self)
push_button.setText(str(parameter['默认值']))
table.setCellWidget(i, 1, push_button)
# 添加参数说明
desc_item = QTableWidgetItem(parameter['说明'])
table.setItem(i, 2, desc_item)
table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 自动列宽
table.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents) # 自动列宽
table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Interactive)
table.setColumnWidth(1, 300)
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MainCode()
ui.show()
sys.exit(app.exec_())
更多推荐
所有评论(0)