将 .ui 文件转换为 .py 文件
pyuic5 -o mainWindow.py mainWindow.ui
显示对话框提示,用于显示测试结果提示,通过python show.py -r pass
连接程序
import sys
from PyQt5.QtWidgets import QMessageBox, QWidget, QApplication
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser('获取参数')
parser.add_argument('-r', '--result')
args = parser.parse_args()
result = args.result
app = QApplication(sys.argv)
ui = QWidget()
if result == 'pass':
QMessageBox.information(ui, '测试结果', '<font size="26" color=\"#00FF00\">PASS</font >')
else:
QMessageBox.information(ui, '测试结果', '<font size="26" color=\"#FF0000\">FAIL</font >')
sys.exit(app.exit()) # 不进行事件循环,直接退出。
在非PyQt的主程序中显示PyQt窗口问题,主程序中必须要有一个 app = QApplication(sys.argv) 且只能有一个,sys.exit()
会导致整个程序退出,必须在程序中始终维持app的存在,即可利用PyQtx显示相关的提示信息
import sys
from PyQt5.QtWidgets import QMessageBox, QWidget, QApplication
if __name__ == '__main__':
app = QApplication(sys.argv)
QMessageBox.information(QWidget(), '测试结果', 'pass')
QMessageBox.information(QWidget(), '测试结果', 'fail')
错误:Process finished with exit code -1073740791 (0xC0000409) ,app不能退出后在实例化,全局只能有一次
import sys
from PyQt5.QtWidgets import QMessageBox, QWidget, QApplication
if __name__ == '__main__':
app = QApplication(sys.argv)
QMessageBox.information(QWidget(), '测试结果', 'pass')
app.exit()
app = QApplication(sys.argv)
QMessageBox.information(QWidget(), '测试结果', 'fail')
app.exit()
设置 QPlainTextEdit 编辑框字体样式
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(14)
self.pack_info.setFont(font) # 对QPlainTextEdit 应用字体
设置 QPlainTextEdit 无法被编辑
self.pack_info.setFocusPolicy(QtCore.Qt.NoFocus) # 使 设置 QPlainTextEdit 无法获取焦点即可
pyinstaller 打包后报错 QWidget:Must construct a QApplication before a QWidget
,主要是由于 app 还未正常运行,就使用了到了相关的显示控件,程序启动时的报错提示窗口等。
app = QApplication(sys.argv)
window = TestWindow()
window.show()
sys.exit(app.exec_())
pyqt5 多线程
from PyQt5.QtCore import QThread, pyqtSignal
class TestThread(QThread):
pass_meter = pyqtSignal(list) # list 指定发送的数据类型,可以为空
def run(self):
# task
self.pass_meter.emit(pass_addr)
pass
class TestWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.add_signal()
def add_signal(self):
self.start_btn.clicked.connect(self.sx_test)
def sx_test(self):
self.sx_test = TestThread()
# 添加信号的处理函数
self.sx_test.pass_meter.connect(self.show_pass_info)
self.sx_test.start()
def show_pass_info(self, addrs): # adds对应信号中的list数据类型,没有就不写
for addr in addrs:
index = get_addr_index(addr)
getattr(self, 'result%s' % index).setText('<font color=\"#00FF00\">PASS</font>')
self.start_btn.setDisabled(False)
注:pyqt 在多线程的环境下,子线程想要修改 UI 文件内容时,需要通过信号把对应的数据信息发送到运行 UI 的主线程中,然后添加对应的槽进行处理即可。
问题记录
TypeError: 'QPushButton' object is not callable
, 由于命名冲突导致的问题,父类中有相同名字,为end_pack的QPushButton,结果又在子类中添加了一个同名的方法为pack_over。
Grid Layout布局问题
Grid Layout 网格布局,在默认的组件默认的伸缩范围内,每个网格的宽度都是一直的,因此想要实现不等宽的组件,因此需要结合合并单元格。在网格默认情况下1,2,3会一样宽,可以对2进行合并单元格的操作,占用2列增加宽度。
pyqt5卡死问题记录
- 先启动线程后
self.run_thread.start()
,再连接线程中的信号与槽函数处理容易出现卡死现象
def start_task_thread(self):
self.run_thread = Qt_Thread(self.task)
self.run_thread.label_state_signal.connect(self.label_status_display)
self.run_thread.case_state_signal.connect(self.test_case_status_display)
self.run_thread.start()