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文件,不会执行后面行的程序。

浙公网安备 33010602011771号