pyqt5:自定义信号实现/pyqt 打开网页/app.exec_()
1、自定义信号
mysignal 定义要放在函数外面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | import sys from PyQt5 import QtCore, QtGui, QtWidgets import cv2 import threading import numpy as np class Ui_MainWindow(QtWidgets.QWidget): #需要继承QtWidgets类才能只用自定义信号,否则会报错Ui_MainWindow cannot be converted to PyQt5.QtCore.QObject in this context #声明一个信号,只能放在函数外面 mysignal = QtCore.pyqtSignal( str ) def setupUi( self , MainWindow): MainWindow.setObjectName( "MainWindow" ) self .centralwidget = QtWidgets.QWidget(MainWindow) MainWindow.resize( 758 , 600 ) self .centralwidget.setObjectName( "centralwidget" ) self .btn_camera = QtWidgets.QPushButton( self .centralwidget) self .btn_camera.setObjectName( "btnCamera" ) self .btn_camera.setGeometry(QtCore.QRect( 80 , 160 , 131 , 23 )) self .lb_signal = QtWidgets.QLabel( self .centralwidget) self .lb_signal.setGeometry(QtCore.QRect( 250 , 50 , 131 , 31 )) self .lb_signal.resize( 150 , 150 ) # 重设Label大小 self .lb_signal.setScaledContents( True ) # 设置图片自适应窗口大小 self .lb_signal.setObjectName( "lb_signal" ) self .lb_imgprocessing = QtWidgets.QLabel( self .centralwidget) self .lb_imgprocessing.setGeometry(QtCore.QRect( 550 , 50 , 131 , 31 )) self .lb_imgprocessing.setObjectName( "lbimgprocessing" ) self .lb_imgprocessing.resize( 150 , 150 ) # 重设Label大小 self .lb_imgprocessing.setScaledContents( True ) # 设置图片自适应窗口大小 MainWindow.setCentralWidget( self .centralwidget) #menubar,statubar self .menubar = QtWidgets.QMenuBar(MainWindow) self .menubar.setGeometry(QtCore.QRect( 0 , 0 , 758 , 23 )) self .menubar.setObjectName( "menubar" ) MainWindow.setMenuBar( self .menubar) self .statusbar = QtWidgets.QStatusBar(MainWindow) self .statusbar.setObjectName( "statusbar" ) MainWindow.setStatusBar( self .statusbar) self .retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) #对mainwindow所有子对象实现connect slot by name的功能。 def retranslateUi( self , MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate( "MainWindow" , "line_detection" )) #self.btn_camera.setText(_translate("MainWindow", "传入图片")) self .btn_camera.setText( "点击传入图片" ) self .btn_camera.clicked.connect( self .on_btnCamera_clicked) #不知道为什么本应该自动连接的,但是却需要我自己加上个connect.?? self .lb_signal.setText( "传入图片" ) self .lb_imgprocessing.setText(_translate( "MainWindow" , "检测结果画面" )) self .mysignal.connect( self .my_slot) # mysignal信号连接 def cvimg_to_pixmap( self ,cvimg): #少了个self,报错Process finished with exit code -1073740791 (0xC0000409) height, width, depth = cvimg.shape cvimg = cv2.cvtColor(cvimg, cv2.COLOR_BGR2RGB) cvimg = QtGui.QImage(cvimg.data, width, height, width * depth, QtGui.QImage.Format_RGB888) #转换成QImage cvimg = QtGui.QPixmap(cvimg).scaled(cvimg.width(), cvimg.height()) #转换成QPixmap return cvimg #def my_slot(self): def my_slot( self ): self .img_processing() def img_processing( self ): #对传入图片进行处理。暂时没做但是现在UI已经按我的预想实现连接了。 self .lb_imgprocessing.setPixmap( self .img) self .lb_imgprocessing.resize( 150 , 150 ) # 重设Label大小 self .lb_imgprocessing.setScaledContents( True ) # 设置图片自适应窗口大小 def on_btnCamera_clicked( self ): #点击button,修改label #直接通过pixmap读取图片 # self.pixmap=QtGui.QPixmap('D:/project/project/line_detect/resources/black_line.png') # self.lb_signal.setPixmap(self.pixmap) self .img = cv2.imread( 'D:/project/project/line_detect/resources/black_line.png' ) self .img = self .cvimg_to_pixmap( self .img) #self.cvimg_to_pixmap是自定义方法 self .lb_signal.setPixmap( self .img) self .mysignal.emit( 'pics are capture' ) if __name__ = = "__main__" : app = QtWidgets.QApplication(sys.argv) # 创建一个QApplication,也就是你要开发的软件app MainWindow = QtWidgets.QMainWindow() # 创建一个QMainWindow,用来装载各种组件、控件 ui = Ui_MainWindow() # ui是Ui_MainWindow()类的实例化对象 ui.setupUi(MainWindow) # 执行类中的setupUi方法,方法的参数是第二步中创建的QMainWindow。相当于对mainwindow进行改写 MainWindow.show() # 显示改写后的MainWindow sys.exit(app.exec_()) # 使用exit()或者点击关闭按钮退出QApplicat |
2、pyqt打开网页
1 2 3 | import webbrowser webbrowser. open ( 'https://www.zhihu.com/question/23711222' ) |
3、app.exec_() 与sys.exit(app.exec_())区别:
app.exec_()#等待app主循环结束的,并在结束后执行后面行的程序
#sys.exit(app.exec_())#起到等待主循环结束的效果,并在结束后退出.py文件,不会执行后面行的程序。
#sys.exit(app.exec_())#起到等待主循环结束的效果,并在结束后退出.py文件,不会执行后面行的程序。
分类:
编程-python / pyqt
标签:
pyqt5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现