pyqt 学习笔记

将 .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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值