pyqt5:自定义信号实现/pyqt 打开网页/app.exec_()
1、自定义信号
mysignal 定义要放在函数外面。
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打开网页
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文件,不会执行后面行的程序。