├── File ├── 1.jpg ├── MainWidget.py ├── __pycache__ │ ├── MainWidget.cpython-36.pyc │ ├── browser_ui.cpython-36.pyc │ └── main.cpython-36.pyc ├── browser_ui.py ├── browser_ui.ui ├── main.py └── moveToThread.py ├── README.md └── Serial ├── __pycache__ └── ui_demo_1.cpython-36.pyc ├── pyserial_demo.py ├── ui_demo_1.py └── ui_demo_1.ui /File/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang-jiankun/Pyqt5-Project/0df80bb76cceb6372a3f870a6838cf9a055b94af/File/1.jpg -------------------------------------------------------------------------------- /File/MainWidget.py: -------------------------------------------------------------------------------- 1 | from PyQt5.QtWidgets import QFileDialog, QWidget 2 | from PyQt5.QtGui import QImage, QPixmap 3 | from PyQt5.QtWidgets import QMessageBox 4 | from PyQt5.QtCore import QThread, pyqtSignal, Qt 5 | from browser_ui import Ui_Form 6 | import cv2 7 | import time 8 | 9 | 10 | class Browser(QWidget): 11 | # 初始化 12 | def __init__(self, parent=None): 13 | super(Browser, self).__init__(parent) 14 | self.ui = Ui_Form() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.pb_browser.clicked.connect(self.slot_open_browser) 18 | self.ui.pb_open.clicked.connect(self.slot_openfile) 19 | 20 | # 打开文件浏览器槽函数 21 | def slot_open_browser(self): 22 | # 打开文件浏览器,获得选择的文件 23 | file_name = QFileDialog.getOpenFileName(self, '选择文件', '', 'Images (*.png *.xpm *.jpg *.avi *.mp4)') 24 | # print(file_name) 25 | # 判断是否选择了文件 26 | if file_name[0] != '': 27 | # print('open') 28 | # 显示文件名 29 | self.ui.lineEdit.setText(file_name[0]) 30 | # 显示文件内容 31 | # with open(file_name[0], 'r') as f: 32 | # my_txt = f.read() 33 | # self.lineEdit.setPlainText(my_txt) 34 | 35 | # 打开文件槽函数 36 | def slot_openfile(self): 37 | # 获取文件名 38 | file_name = self.ui.lineEdit.text() 39 | if file_name == '': 40 | QMessageBox.information(self, 'empty error', '请选择文件') 41 | return 42 | temp = file_name.split('.')[-1] 43 | if temp == 'avi' or temp == 'mp4': 44 | self.th = Thread(file_name, self) 45 | self.th.show_signal.connect(self.show_image) 46 | self.th.start() 47 | # 如果th不不定义为类属性,需要下面这两句,程序运行播放视频才不会出错 48 | # self.image = QImage(file_name) 49 | # self.ui.lb_show.setPixmap(QPixmap.fromImage(self.image)) 50 | return 51 | 52 | # img = cv2.imread(file_name) 53 | # cv2.imshow('photo', img) 54 | # 把图像转换为QT格式 55 | self.image = QImage(file_name) 56 | self.ui.lb_show.setPixmap(QPixmap.fromImage(self.image)) 57 | 58 | def show_image(self, image): 59 | # 在label上显示图片 60 | self.ui.lb_show.setPixmap(QPixmap.fromImage(image)) 61 | # 缩放窗 62 | # self.resize(self.image.width(), self.image.height()) 63 | 64 | 65 | # 采用线程来播放视频 66 | class Thread(QThread): 67 | # 自定义信号 68 | show_signal = pyqtSignal(QImage) 69 | 70 | # 构造函数,接受参数 71 | def __init__(self, file_name, browser): 72 | QThread.__init__(self) 73 | self.video_name = file_name 74 | self.browser = browser 75 | 76 | # 重写run()方法 77 | def run(self): 78 | # 实例化一个读取视频对象 79 | cap = cv2.VideoCapture(self.video_name) 80 | 81 | while cap.isOpened(): 82 | # 读取视频帧 83 | ret, frame = cap.read() 84 | # 获取视频的帧数 85 | fps = cap.get(cv2.CAP_PROP_FPS) 86 | 87 | if ret: 88 | # 转换图片格式 89 | rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 90 | qt_image = QImage(rgb_image.data, rgb_image.shape[1], rgb_image.shape[0], QImage.Format_RGB888) 91 | p = qt_image.scaled(640, 480, Qt.KeepAspectRatio) 92 | # 发射信号 93 | print('线程: %s' % hex(int(QThread.currentThreadId()))) 94 | self.show_signal.emit(p) 95 | time.sleep(1/fps) 96 | else: 97 | image = QImage('E:/11.jpg') 98 | self.browser.ui.lb_show.setPixmap(QPixmap.fromImage(image)) 99 | self.browser.ui.lb_show.adjustSize() 100 | print('播放结束') 101 | break 102 | -------------------------------------------------------------------------------- /File/__pycache__/MainWidget.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang-jiankun/Pyqt5-Project/0df80bb76cceb6372a3f870a6838cf9a055b94af/File/__pycache__/MainWidget.cpython-36.pyc -------------------------------------------------------------------------------- /File/__pycache__/browser_ui.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang-jiankun/Pyqt5-Project/0df80bb76cceb6372a3f870a6838cf9a055b94af/File/__pycache__/browser_ui.cpython-36.pyc -------------------------------------------------------------------------------- /File/__pycache__/main.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang-jiankun/Pyqt5-Project/0df80bb76cceb6372a3f870a6838cf9a055b94af/File/__pycache__/main.cpython-36.pyc -------------------------------------------------------------------------------- /File/browser_ui.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'browser.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.11.2 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | 11 | class Ui_Form(object): 12 | def setupUi(self, Form): 13 | Form.setObjectName("Form") 14 | Form.resize(518, 549) 15 | self.verticalLayout = QtWidgets.QVBoxLayout(Form) 16 | self.verticalLayout.setObjectName("verticalLayout") 17 | self.horizontalLayout = QtWidgets.QHBoxLayout() 18 | self.horizontalLayout.setObjectName("horizontalLayout") 19 | self.lineEdit = QtWidgets.QLineEdit(Form) 20 | self.lineEdit.setObjectName("lineEdit") 21 | self.horizontalLayout.addWidget(self.lineEdit) 22 | self.pb_browser = QtWidgets.QPushButton(Form) 23 | self.pb_browser.setObjectName("pb_browser") 24 | self.horizontalLayout.addWidget(self.pb_browser) 25 | self.pb_open = QtWidgets.QPushButton(Form) 26 | self.pb_open.setObjectName("pb_open") 27 | self.horizontalLayout.addWidget(self.pb_open) 28 | self.verticalLayout.addLayout(self.horizontalLayout) 29 | self.lb_show = QtWidgets.QLabel(Form) 30 | self.lb_show.setText("") 31 | self.lb_show.setPixmap(QtGui.QPixmap("1.jpg")) 32 | self.lb_show.setScaledContents(True) 33 | self.lb_show.setWordWrap(False) 34 | self.lb_show.setObjectName("lb_show") 35 | self.verticalLayout.addWidget(self.lb_show) 36 | 37 | self.retranslateUi(Form) 38 | QtCore.QMetaObject.connectSlotsByName(Form) 39 | 40 | def retranslateUi(self, Form): 41 | _translate = QtCore.QCoreApplication.translate 42 | Form.setWindowTitle(_translate("Form", "File browser")) 43 | self.pb_browser.setWhatsThis(_translate("Form", "

浏览文件

")) 44 | self.pb_browser.setText(_translate("Form", "浏览")) 45 | self.pb_open.setText(_translate("Form", "打开")) 46 | 47 | -------------------------------------------------------------------------------- /File/browser_ui.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Form 4 | 5 | 6 | 7 | 0 8 | 0 9 | 518 10 | 549 11 | 12 | 13 | 14 | File browser 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | <html><head/><body><p>浏览文件</p></body></html> 26 | 27 | 28 | 浏览 29 | 30 | 31 | 32 | 33 | 34 | 35 | 打开 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 1.jpg 48 | 49 | 50 | true 51 | 52 | 53 | false 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /File/main.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from PyQt5 import sip 3 | from PyQt5.QtWidgets import QApplication 4 | from PyQt5.QtCore import QThread 5 | from MainWidget import Browser 6 | 7 | app = QApplication(sys.argv) 8 | print('主线程: %s' % hex(int(QThread.currentThreadId()))) 9 | my_window = Browser() 10 | my_window.show() 11 | sys.exit(app.exec_()) 12 | -------------------------------------------------------------------------------- /File/moveToThread.py: -------------------------------------------------------------------------------- 1 | from PyQt5.QtCore import QThread, QObject 2 | 3 | 4 | # 创建自己的类继承自QObject,并写一个工作函数 5 | class Worker(QObject): 6 | def __init__(self, parent=None): 7 | super(Worker, self).__init__(parent) 8 | 9 | def work(self): 10 | print('当前线程: %s' % hex(int(QThread.currentThreadId()))) 11 | 12 | 13 | if __name__ == '__main__': 14 | import sys 15 | from PyQt5.QtWidgets import QApplication 16 | 17 | app = QApplication(sys.argv) 18 | # 查看当前线程id 19 | print('主线程: %s' % hex(int(QThread.currentThreadId()))) 20 | # 实例化线程对象 21 | t = QThread() 22 | # 实例化工作类对象 23 | worker = Worker() 24 | # 工作类对象转化为线程对象 25 | worker.moveToThread(t) 26 | # 绑定线程启动信号的槽函数 27 | t.started.connect(worker.work) 28 | # 启动线程 29 | t.start() 30 | 31 | app.exec_() 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pyqt5-Project 2 | 基于pyqt5的一些小项目实践 3 | 4 | 一、串口通讯助手 5 | 文件夹:Serial 6 | 内容: 7 | pyserial_demo.py:程序功能代码 8 | ui_demo_1.py:界面代码 9 | ui_demo_1.ui:界面设计 10 | 11 | 二、图片和视频浏览器 12 | 文件夹:File 13 | 内容: 14 | main.py:程序主循环代码 15 | MainWidget.py:窗口类设计 16 | browser_ui.py:界面代码 17 | browser_ui.py:界面设计 18 | 1.jpg:图片资源 19 | moveToThread.py:另一种实现多线程的方法 20 | -------------------------------------------------------------------------------- /Serial/__pycache__/ui_demo_1.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang-jiankun/Pyqt5-Project/0df80bb76cceb6372a3f870a6838cf9a055b94af/Serial/__pycache__/ui_demo_1.cpython-36.pyc -------------------------------------------------------------------------------- /Serial/pyserial_demo.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import serial 3 | import serial.tools.list_ports 4 | from PyQt5 import QtWidgets 5 | from PyQt5.QtWidgets import QMessageBox 6 | from PyQt5.QtCore import QTimer 7 | from Serial.ui_demo_1 import Ui_Form 8 | 9 | 10 | class Serial(QtWidgets.QWidget, Ui_Form): 11 | def __init__(self): 12 | super(Serial, self).__init__() 13 | self.setupUi(self) 14 | self.init() 15 | self.setWindowTitle("串口助手") 16 | self.ser = serial.Serial() 17 | self.port_check() 18 | 19 | # 接收数据和发送数据数目置零 20 | self.data_num_received = 0 21 | self.lineEdit.setText(str(self.data_num_received)) 22 | self.data_num_sended = 0 23 | self.lineEdit_2.setText(str(self.data_num_sended)) 24 | 25 | def init(self): 26 | # 串口检测按钮 27 | self.s1__box_1.clicked.connect(self.port_check) 28 | 29 | # 串口信息显示 30 | self.s1__box_2.currentTextChanged.connect(self.port_imf) 31 | 32 | # 打开串口按钮 33 | self.open_button.clicked.connect(self.port_open) 34 | 35 | # 关闭串口按钮 36 | self.close_button.clicked.connect(self.port_close) 37 | 38 | # 发送数据按钮 39 | self.s3__send_button.clicked.connect(self.data_send) 40 | 41 | # 定时发送数据 42 | self.timer_send = QTimer() 43 | self.timer_send.timeout.connect(self.data_send) 44 | self.timer_send_cb.stateChanged.connect(self.data_send_timer) 45 | 46 | # 定时器接收数据 47 | self.timer = QTimer(self) 48 | self.timer.timeout.connect(self.data_receive) 49 | 50 | # 清除发送窗口 51 | self.s3__clear_button.clicked.connect(self.send_data_clear) 52 | 53 | # 清除接收窗口 54 | self.s2__clear_button.clicked.connect(self.receive_data_clear) 55 | 56 | # 串口检测 57 | def port_check(self): 58 | # 检测所有存在的串口,将信息存储在字典中 59 | self.Com_Dict = {} 60 | port_list = list(serial.tools.list_ports.comports()) 61 | self.s1__box_2.clear() 62 | for port in port_list: 63 | self.Com_Dict["%s" % port[0]] = "%s" % port[1] 64 | self.s1__box_2.addItem(port[0]) 65 | if len(self.Com_Dict) == 0: 66 | self.state_label.setText(" 无串口") 67 | 68 | # 串口信息 69 | def port_imf(self): 70 | # 显示选定的串口的详细信息 71 | imf_s = self.s1__box_2.currentText() 72 | if imf_s != "": 73 | self.state_label.setText(self.Com_Dict[self.s1__box_2.currentText()]) 74 | 75 | # 打开串口 76 | def port_open(self): 77 | self.ser.port = self.s1__box_2.currentText() 78 | self.ser.baudrate = int(self.s1__box_3.currentText()) 79 | self.ser.bytesize = int(self.s1__box_4.currentText()) 80 | self.ser.stopbits = int(self.s1__box_6.currentText()) 81 | self.ser.parity = self.s1__box_5.currentText() 82 | 83 | try: 84 | self.ser.open() 85 | except: 86 | QMessageBox.critical(self, "Port Error", "此串口不能被打开!") 87 | return None 88 | 89 | # 打开串口接收定时器,周期为2ms 90 | self.timer.start(2) 91 | 92 | if self.ser.isOpen(): 93 | self.open_button.setEnabled(False) 94 | self.close_button.setEnabled(True) 95 | self.formGroupBox1.setTitle("串口状态(已开启)") 96 | 97 | # 关闭串口 98 | def port_close(self): 99 | self.timer.stop() 100 | self.timer_send.stop() 101 | try: 102 | self.ser.close() 103 | except: 104 | pass 105 | self.open_button.setEnabled(True) 106 | self.close_button.setEnabled(False) 107 | self.lineEdit_3.setEnabled(True) 108 | # 接收数据和发送数据数目置零 109 | self.data_num_received = 0 110 | self.lineEdit.setText(str(self.data_num_received)) 111 | self.data_num_sended = 0 112 | self.lineEdit_2.setText(str(self.data_num_sended)) 113 | self.formGroupBox1.setTitle("串口状态(已关闭)") 114 | 115 | # 发送数据 116 | def data_send(self): 117 | if self.ser.isOpen(): 118 | input_s = self.s3__send_text.toPlainText() 119 | if input_s != "": 120 | # 非空字符串 121 | if self.hex_send.isChecked(): 122 | # hex发送 123 | input_s = input_s.strip() 124 | send_list = [] 125 | while input_s != '': 126 | try: 127 | num = int(input_s[0:2], 16) 128 | except ValueError: 129 | QMessageBox.critical(self, 'wrong data', '请输入十六进制数据,以空格分开!') 130 | return None 131 | input_s = input_s[2:].strip() 132 | send_list.append(num) 133 | input_s = bytes(send_list) 134 | else: 135 | # ascii发送 136 | input_s = (input_s + '\r\n').encode('utf-8') 137 | 138 | num = self.ser.write(input_s) 139 | self.data_num_sended += num 140 | self.lineEdit_2.setText(str(self.data_num_sended)) 141 | else: 142 | pass 143 | 144 | # 接收数据 145 | def data_receive(self): 146 | try: 147 | num = self.ser.inWaiting() 148 | except: 149 | self.port_close() 150 | return None 151 | if num > 0: 152 | data = self.ser.read(num) 153 | num = len(data) 154 | # hex显示 155 | if self.hex_receive.checkState(): 156 | out_s = '' 157 | for i in range(0, len(data)): 158 | out_s = out_s + '{:02X}'.format(data[i]) + ' ' 159 | self.s2__receive_text.insertPlainText(out_s) 160 | else: 161 | # 串口接收到的字符串为b'123',要转化成unicode字符串才能输出到窗口中去 162 | self.s2__receive_text.insertPlainText(data.decode('iso-8859-1')) 163 | 164 | # 统计接收字符的数量 165 | self.data_num_received += num 166 | self.lineEdit.setText(str(self.data_num_received)) 167 | 168 | # 获取到text光标 169 | textCursor = self.s2__receive_text.textCursor() 170 | # 滚动到底部 171 | textCursor.movePosition(textCursor.End) 172 | # 设置光标到text中去 173 | self.s2__receive_text.setTextCursor(textCursor) 174 | else: 175 | pass 176 | 177 | # 定时发送数据 178 | def data_send_timer(self): 179 | if self.timer_send_cb.isChecked(): 180 | self.timer_send.start(int(self.lineEdit_3.text())) 181 | self.lineEdit_3.setEnabled(False) 182 | else: 183 | self.timer_send.stop() 184 | self.lineEdit_3.setEnabled(True) 185 | 186 | # 清除显示 187 | def send_data_clear(self): 188 | self.s3__send_text.setText("") 189 | 190 | def receive_data_clear(self): 191 | self.s2__receive_text.setText("") 192 | 193 | 194 | if __name__ == '__main__': 195 | app = QtWidgets.QApplication(sys.argv) 196 | myshow = Serial() 197 | myshow.show() 198 | sys.exit(app.exec_()) 199 | -------------------------------------------------------------------------------- /Serial/ui_demo_1.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'demo_1.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.6 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | 11 | class Ui_Form(object): 12 | def setupUi(self, Form): 13 | Form.setObjectName("Form") 14 | Form.resize(707, 458) 15 | self.formGroupBox = QtWidgets.QGroupBox(Form) 16 | self.formGroupBox.setGeometry(QtCore.QRect(20, 20, 167, 301)) 17 | self.formGroupBox.setObjectName("formGroupBox") 18 | self.formLayout = QtWidgets.QFormLayout(self.formGroupBox) 19 | self.formLayout.setContentsMargins(10, 10, 10, 10) 20 | self.formLayout.setSpacing(10) 21 | self.formLayout.setObjectName("formLayout") 22 | self.s1__lb_1 = QtWidgets.QLabel(self.formGroupBox) 23 | self.s1__lb_1.setObjectName("s1__lb_1") 24 | self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.s1__lb_1) 25 | self.s1__box_1 = QtWidgets.QPushButton(self.formGroupBox) 26 | self.s1__box_1.setAutoRepeatInterval(100) 27 | self.s1__box_1.setDefault(True) 28 | self.s1__box_1.setObjectName("s1__box_1") 29 | self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.s1__box_1) 30 | self.s1__lb_2 = QtWidgets.QLabel(self.formGroupBox) 31 | self.s1__lb_2.setObjectName("s1__lb_2") 32 | self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.s1__lb_2) 33 | self.s1__box_2 = QtWidgets.QComboBox(self.formGroupBox) 34 | self.s1__box_2.setObjectName("s1__box_2") 35 | self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.s1__box_2) 36 | self.s1__lb_3 = QtWidgets.QLabel(self.formGroupBox) 37 | self.s1__lb_3.setObjectName("s1__lb_3") 38 | self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.s1__lb_3) 39 | self.s1__box_3 = QtWidgets.QComboBox(self.formGroupBox) 40 | self.s1__box_3.setObjectName("s1__box_3") 41 | self.s1__box_3.addItem("") 42 | self.s1__box_3.addItem("") 43 | self.s1__box_3.addItem("") 44 | self.s1__box_3.addItem("") 45 | self.s1__box_3.addItem("") 46 | self.s1__box_3.addItem("") 47 | self.s1__box_3.addItem("") 48 | self.s1__box_3.addItem("") 49 | self.s1__box_3.addItem("") 50 | self.s1__box_3.addItem("") 51 | self.s1__box_3.addItem("") 52 | self.s1__box_3.addItem("") 53 | self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.s1__box_3) 54 | self.s1__lb_4 = QtWidgets.QLabel(self.formGroupBox) 55 | self.s1__lb_4.setObjectName("s1__lb_4") 56 | self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.s1__lb_4) 57 | self.s1__box_4 = QtWidgets.QComboBox(self.formGroupBox) 58 | self.s1__box_4.setObjectName("s1__box_4") 59 | self.s1__box_4.addItem("") 60 | self.s1__box_4.addItem("") 61 | self.s1__box_4.addItem("") 62 | self.s1__box_4.addItem("") 63 | self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.s1__box_4) 64 | self.s1__lb_5 = QtWidgets.QLabel(self.formGroupBox) 65 | self.s1__lb_5.setObjectName("s1__lb_5") 66 | self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.s1__lb_5) 67 | self.s1__box_5 = QtWidgets.QComboBox(self.formGroupBox) 68 | self.s1__box_5.setObjectName("s1__box_5") 69 | self.s1__box_5.addItem("") 70 | self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.s1__box_5) 71 | self.open_button = QtWidgets.QPushButton(self.formGroupBox) 72 | self.open_button.setObjectName("open_button") 73 | self.formLayout.setWidget(7, QtWidgets.QFormLayout.SpanningRole, self.open_button) 74 | self.close_button = QtWidgets.QPushButton(self.formGroupBox) 75 | self.close_button.setObjectName("close_button") 76 | self.formLayout.setWidget(8, QtWidgets.QFormLayout.SpanningRole, self.close_button) 77 | self.s1__lb_6 = QtWidgets.QLabel(self.formGroupBox) 78 | self.s1__lb_6.setObjectName("s1__lb_6") 79 | self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.s1__lb_6) 80 | self.s1__box_6 = QtWidgets.QComboBox(self.formGroupBox) 81 | self.s1__box_6.setObjectName("s1__box_6") 82 | self.s1__box_6.addItem("") 83 | self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.s1__box_6) 84 | self.state_label = QtWidgets.QLabel(self.formGroupBox) 85 | self.state_label.setText("") 86 | self.state_label.setTextFormat(QtCore.Qt.AutoText) 87 | self.state_label.setScaledContents(True) 88 | self.state_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 89 | self.state_label.setObjectName("state_label") 90 | self.formLayout.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.state_label) 91 | self.verticalGroupBox = QtWidgets.QGroupBox(Form) 92 | self.verticalGroupBox.setGeometry(QtCore.QRect(210, 20, 401, 241)) 93 | self.verticalGroupBox.setObjectName("verticalGroupBox") 94 | self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalGroupBox) 95 | self.verticalLayout.setContentsMargins(10, 10, 10, 10) 96 | self.verticalLayout.setObjectName("verticalLayout") 97 | self.s2__receive_text = QtWidgets.QTextBrowser(self.verticalGroupBox) 98 | self.s2__receive_text.setObjectName("s2__receive_text") 99 | self.verticalLayout.addWidget(self.s2__receive_text) 100 | self.verticalGroupBox_2 = QtWidgets.QGroupBox(Form) 101 | self.verticalGroupBox_2.setGeometry(QtCore.QRect(210, 280, 401, 101)) 102 | self.verticalGroupBox_2.setObjectName("verticalGroupBox_2") 103 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalGroupBox_2) 104 | self.verticalLayout_2.setContentsMargins(10, 10, 10, 10) 105 | self.verticalLayout_2.setObjectName("verticalLayout_2") 106 | self.s3__send_text = QtWidgets.QTextEdit(self.verticalGroupBox_2) 107 | self.s3__send_text.setObjectName("s3__send_text") 108 | self.verticalLayout_2.addWidget(self.s3__send_text) 109 | self.s3__send_button = QtWidgets.QPushButton(Form) 110 | self.s3__send_button.setGeometry(QtCore.QRect(620, 310, 61, 31)) 111 | self.s3__send_button.setObjectName("s3__send_button") 112 | self.s3__clear_button = QtWidgets.QPushButton(Form) 113 | self.s3__clear_button.setGeometry(QtCore.QRect(620, 350, 61, 31)) 114 | self.s3__clear_button.setObjectName("s3__clear_button") 115 | self.formGroupBox1 = QtWidgets.QGroupBox(Form) 116 | self.formGroupBox1.setGeometry(QtCore.QRect(20, 340, 171, 101)) 117 | self.formGroupBox1.setObjectName("formGroupBox1") 118 | self.formLayout_2 = QtWidgets.QFormLayout(self.formGroupBox1) 119 | self.formLayout_2.setContentsMargins(10, 10, 10, 10) 120 | self.formLayout_2.setSpacing(10) 121 | self.formLayout_2.setObjectName("formLayout_2") 122 | self.label = QtWidgets.QLabel(self.formGroupBox1) 123 | self.label.setObjectName("label") 124 | self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label) 125 | self.label_2 = QtWidgets.QLabel(self.formGroupBox1) 126 | self.label_2.setObjectName("label_2") 127 | self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2) 128 | self.lineEdit = QtWidgets.QLineEdit(self.formGroupBox1) 129 | self.lineEdit.setObjectName("lineEdit") 130 | self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit) 131 | self.lineEdit_2 = QtWidgets.QLineEdit(self.formGroupBox1) 132 | self.lineEdit_2.setObjectName("lineEdit_2") 133 | self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2) 134 | self.hex_send = QtWidgets.QCheckBox(Form) 135 | self.hex_send.setGeometry(QtCore.QRect(620, 280, 71, 16)) 136 | self.hex_send.setObjectName("hex_send") 137 | self.hex_receive = QtWidgets.QCheckBox(Form) 138 | self.hex_receive.setGeometry(QtCore.QRect(620, 40, 71, 16)) 139 | self.hex_receive.setObjectName("hex_receive") 140 | self.s2__clear_button = QtWidgets.QPushButton(Form) 141 | self.s2__clear_button.setGeometry(QtCore.QRect(620, 80, 61, 31)) 142 | self.s2__clear_button.setObjectName("s2__clear_button") 143 | self.timer_send_cb = QtWidgets.QCheckBox(Form) 144 | self.timer_send_cb.setGeometry(QtCore.QRect(260, 390, 71, 16)) 145 | self.timer_send_cb.setObjectName("timer_send_cb") 146 | self.lineEdit_3 = QtWidgets.QLineEdit(Form) 147 | self.lineEdit_3.setGeometry(QtCore.QRect(350, 390, 61, 20)) 148 | self.lineEdit_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 149 | self.lineEdit_3.setObjectName("lineEdit_3") 150 | self.dw = QtWidgets.QLabel(Form) 151 | self.dw.setGeometry(QtCore.QRect(420, 390, 54, 20)) 152 | self.dw.setObjectName("dw") 153 | self.verticalGroupBox.raise_() 154 | self.verticalGroupBox_2.raise_() 155 | self.formGroupBox.raise_() 156 | self.s3__send_button.raise_() 157 | self.s3__clear_button.raise_() 158 | self.formGroupBox.raise_() 159 | self.hex_send.raise_() 160 | self.hex_receive.raise_() 161 | self.s2__clear_button.raise_() 162 | self.timer_send_cb.raise_() 163 | self.lineEdit_3.raise_() 164 | self.dw.raise_() 165 | 166 | self.retranslateUi(Form) 167 | QtCore.QMetaObject.connectSlotsByName(Form) 168 | 169 | def retranslateUi(self, Form): 170 | _translate = QtCore.QCoreApplication.translate 171 | Form.setWindowTitle(_translate("Form", "Form")) 172 | self.formGroupBox.setTitle(_translate("Form", "串口设置")) 173 | self.s1__lb_1.setText(_translate("Form", "串口检测:")) 174 | self.s1__box_1.setText(_translate("Form", "检测串口")) 175 | self.s1__lb_2.setText(_translate("Form", "串口选择:")) 176 | self.s1__lb_3.setText(_translate("Form", "波特率:")) 177 | self.s1__box_3.setItemText(0, _translate("Form", "115200")) 178 | self.s1__box_3.setItemText(1, _translate("Form", "2400")) 179 | self.s1__box_3.setItemText(2, _translate("Form", "4800")) 180 | self.s1__box_3.setItemText(3, _translate("Form", "9600")) 181 | self.s1__box_3.setItemText(4, _translate("Form", "14400")) 182 | self.s1__box_3.setItemText(5, _translate("Form", "19200")) 183 | self.s1__box_3.setItemText(6, _translate("Form", "38400")) 184 | self.s1__box_3.setItemText(7, _translate("Form", "57600")) 185 | self.s1__box_3.setItemText(8, _translate("Form", "76800")) 186 | self.s1__box_3.setItemText(9, _translate("Form", "12800")) 187 | self.s1__box_3.setItemText(10, _translate("Form", "230400")) 188 | self.s1__box_3.setItemText(11, _translate("Form", "460800")) 189 | self.s1__lb_4.setText(_translate("Form", "数据位:")) 190 | self.s1__box_4.setItemText(0, _translate("Form", "8")) 191 | self.s1__box_4.setItemText(1, _translate("Form", "7")) 192 | self.s1__box_4.setItemText(2, _translate("Form", "6")) 193 | self.s1__box_4.setItemText(3, _translate("Form", "5")) 194 | self.s1__lb_5.setText(_translate("Form", "校验位:")) 195 | self.s1__box_5.setItemText(0, _translate("Form", "N")) 196 | self.open_button.setText(_translate("Form", "打开串口")) 197 | self.close_button.setText(_translate("Form", "关闭串口")) 198 | self.s1__lb_6.setText(_translate("Form", "停止位:")) 199 | self.s1__box_6.setItemText(0, _translate("Form", "1")) 200 | self.verticalGroupBox.setTitle(_translate("Form", "接受区")) 201 | self.verticalGroupBox_2.setTitle(_translate("Form", "发送区")) 202 | self.s3__send_text.setHtml(_translate("Form", "\n" 203 | "\n" 206 | "

123456

")) 207 | self.s3__send_button.setText(_translate("Form", "发送")) 208 | self.s3__clear_button.setText(_translate("Form", "清除")) 209 | self.formGroupBox1.setTitle(_translate("Form", "串口状态")) 210 | self.label.setText(_translate("Form", "已接收:")) 211 | self.label_2.setText(_translate("Form", "已发送:")) 212 | self.hex_send.setText(_translate("Form", "Hex发送")) 213 | self.hex_receive.setText(_translate("Form", "Hex接收")) 214 | self.s2__clear_button.setText(_translate("Form", "清除")) 215 | self.timer_send_cb.setText(_translate("Form", "定时发送")) 216 | self.lineEdit_3.setText(_translate("Form", "1000")) 217 | self.dw.setText(_translate("Form", "ms/次")) 218 | 219 | -------------------------------------------------------------------------------- /Serial/ui_demo_1.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Form 4 | 5 | 6 | 7 | 0 8 | 0 9 | 707 10 | 458 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 19 | 20 20 | 20 21 | 167 22 | 301 23 | 24 | 25 | 26 | 串口设置 27 | 28 | 29 | 30 | 10 31 | 32 | 33 | 10 34 | 35 | 36 | 10 37 | 38 | 39 | 10 40 | 41 | 42 | 10 43 | 44 | 45 | 10 46 | 47 | 48 | 49 | 50 | 串口检测: 51 | 52 | 53 | 54 | 55 | 56 | 57 | 检测串口 58 | 59 | 60 | 100 61 | 62 | 63 | true 64 | 65 | 66 | 67 | 68 | 69 | 70 | 串口选择: 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 波特率: 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 115200 89 | 90 | 91 | 92 | 93 | 2400 94 | 95 | 96 | 97 | 98 | 4800 99 | 100 | 101 | 102 | 103 | 9600 104 | 105 | 106 | 107 | 108 | 14400 109 | 110 | 111 | 112 | 113 | 19200 114 | 115 | 116 | 117 | 118 | 38400 119 | 120 | 121 | 122 | 123 | 57600 124 | 125 | 126 | 127 | 128 | 76800 129 | 130 | 131 | 132 | 133 | 12800 134 | 135 | 136 | 137 | 138 | 230400 139 | 140 | 141 | 142 | 143 | 460800 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 数据位: 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 8 160 | 161 | 162 | 163 | 164 | 7 165 | 166 | 167 | 168 | 169 | 6 170 | 171 | 172 | 173 | 174 | 5 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 校验位: 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | N 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 打开串口 199 | 200 | 201 | 202 | 203 | 204 | 205 | 关闭串口 206 | 207 | 208 | 209 | 210 | 211 | 212 | 停止位: 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 1 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | Qt::AutoText 232 | 233 | 234 | true 235 | 236 | 237 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 210 247 | 20 248 | 401 249 | 241 250 | 251 | 252 | 253 | 接受区 254 | 255 | 256 | 257 | 10 258 | 259 | 260 | 10 261 | 262 | 263 | 10 264 | 265 | 266 | 10 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 210 277 | 280 278 | 401 279 | 101 280 | 281 | 282 | 283 | 发送区 284 | 285 | 286 | 287 | 10 288 | 289 | 290 | 10 291 | 292 | 293 | 10 294 | 295 | 296 | 10 297 | 298 | 299 | 300 | 301 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> 302 | <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 303 | p, li { white-space: pre-wrap; } 304 | </style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> 305 | <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">123456</p></body></html> 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 620 315 | 310 316 | 61 317 | 31 318 | 319 | 320 | 321 | 发送 322 | 323 | 324 | 325 | 326 | 327 | 620 328 | 350 329 | 61 330 | 31 331 | 332 | 333 | 334 | 清除 335 | 336 | 337 | 338 | 339 | 340 | 20 341 | 340 342 | 171 343 | 101 344 | 345 | 346 | 347 | 串口状态 348 | 349 | 350 | 351 | 10 352 | 353 | 354 | 10 355 | 356 | 357 | 10 358 | 359 | 360 | 10 361 | 362 | 363 | 10 364 | 365 | 366 | 10 367 | 368 | 369 | 370 | 371 | 已接收: 372 | 373 | 374 | 375 | 376 | 377 | 378 | 已发送: 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 620 394 | 280 395 | 71 396 | 16 397 | 398 | 399 | 400 | Hex发送 401 | 402 | 403 | 404 | 405 | 406 | 620 407 | 40 408 | 71 409 | 16 410 | 411 | 412 | 413 | Hex接收 414 | 415 | 416 | 417 | 418 | 419 | 620 420 | 80 421 | 61 422 | 31 423 | 424 | 425 | 426 | 清除 427 | 428 | 429 | 430 | 431 | 432 | 260 433 | 390 434 | 71 435 | 16 436 | 437 | 438 | 439 | 定时发送 440 | 441 | 442 | 443 | 444 | 445 | 350 446 | 390 447 | 61 448 | 20 449 | 450 | 451 | 452 | 1000 453 | 454 | 455 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 456 | 457 | 458 | 459 | 460 | 461 | 420 462 | 390 463 | 54 464 | 20 465 | 466 | 467 | 468 | ms/次 469 | 470 | 471 | verticalGroupBox 472 | verticalGroupBox_2 473 | formGroupBox 474 | s3__send_button 475 | s3__clear_button 476 | formGroupBox 477 | hex_send 478 | hex_receive 479 | s2__clear_button 480 | timer_send_cb 481 | lineEdit_3 482 | dw 483 | 484 | 485 | 486 | 487 | --------------------------------------------------------------------------------