在投屏的工具上,添加了一个进度条出现了如下报错:
QBackingStore::endPaint() called with active painter; did you forget to destroy it or call QPainter::end() on it?
代码如下:
screen_air.py
from PyQt5 import QtCore, QtGui, QtWidgets
import time
import mainActivity
import sys
from airtest.core.api import *
import cv2
import traceback
from airtest.core.android.cap_methods import minicap
import airtest.core.android
# 实时获取设备画面并渲染到UI界面
class GetPicByAir(QtCore.QThread):
def __init__(self):
super(GetPicByAir, self).__init__()
def run(self) -> None:
print('start ....')
auto_setup(__file__, logdir=False, devices=['android://127.0.0.1:5037/HA1L00JJ'])
while True:
try:
# start_time = time.time()
screen = G.DEVICE.snapshot(quality=10) # 通过airtest提供的接口截图
if screen is not None:
show = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB) # 将图片转换为RGB格式
showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
mainui.pic_label.setPixmap(QtGui.QPixmap.fromImage(showImage)) # 将图片显示在控件上
mainui.pic_label.setScaledContents(True)
# print(time.time() - start_time)
except:
pass
# set progressbar
class SendProgressBarSignal(QtCore.QThread):
progressBarValue = QtCore.pyqtSignal(int) # 更新进度条
def __init__(self):
super(SendProgressBarSignal, self).__init__()
def run(self):
for i in range(101):
time.sleep(0.5)
mainui.progressBar.setValue(i)
class MyMainWindow(QtWidgets.QMainWindow, mainActivity.Ui_MainWindow):
def __init__(self):
super(MyMainWindow, self).__init__()
self.setupUi(self)
def retranslateUi(self, MainWindow):
super(MyMainWindow, self).retranslateUi(MainWindow)
self.pic_button.clicked.connect(self.getDeviceScreen)
self.pic_button.clicked.connect(self.setProgressBarValue)
# 设置投屏线程
def getDeviceScreen(self):
self.mydeviceScreen = GetPicByAir()
self.mydeviceScreen.start()
# 设置进度条线程
def setProgressBarValue(self):
self.thread_setprogressbar_value = SendProgressBarSignal()
self.thread_setprogressbar_value.start()
if __name__ == "__main__":
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QtWidgets.QApplication(sys.argv)
mainui = MyMainWindow()
mainui.show()
sys.exit(app.exec_())
mainActivity.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mainActivity.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1200, 2500)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pic_label = QtWidgets.QLabel(self.centralwidget)
self.pic_label.setGeometry(QtCore.QRect(100, 0, 550, 1000))
self.pic_button = QtWidgets.QPushButton(self.centralwidget)
self.pic_button.setGeometry(QtCore.QRect(980, 10, 151,31))
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar.setGeometry(QtCore.QRect(800, 300, 450, 50))
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
一开始的思路是,新建一个线程不停设置progressbar的value,然后在主线程中启动子线程就可以了,但是和投屏线程一起启动的话就会报上面提到的错误。
所以修改为以下方案.
screen_air.py
from PyQt5 import QtCore, QtGui, QtWidgets
import time
import mainActivity
import sys
from airtest.core.api import *
import cv2
import traceback
from airtest.core.android.cap_methods import minicap
import airtest.core.android
# 实时获取设备画面并渲染到UI界面
class GetPicByAir(QtCore.QThread):
def __init__(self):
super(GetPicByAir, self).__init__()
def run(self) -> None:
print('start ....')
auto_setup(__file__, logdir=False, devices=['android://127.0.0.1:5037/HA1L00JJ'])
while True:
try:
# start_time = time.time()
screen = G.DEVICE.snapshot(quality=10) # 通过airtest提供的接口截图
if screen is not None:
show = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB) # 将图片转换为RGB格式
showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
mainui.pic_label.setPixmap(QtGui.QPixmap.fromImage(showImage)) # 将图片显示在控件上
mainui.pic_label.setScaledContents(True)
# print(time.time() - start_time)
except:
pass
# set progressbar
class SendProgressBarSignal(QtCore.QThread):
progressBarValue = QtCore.pyqtSignal(int) # 更新进度条
def __init__(self):
super(SendProgressBarSignal, self).__init__()
def run(self):
for i in range(101):
time.sleep(0.5)
self.progressBarValue.emit(i)
class MyMainWindow(QtWidgets.QMainWindow, mainActivity.Ui_MainWindow):
def __init__(self):
super(MyMainWindow, self).__init__()
self.setupUi(self)
def retranslateUi(self, MainWindow):
super(MyMainWindow, self).retranslateUi(MainWindow)
self.pic_button.clicked.connect(self.getDeviceScreen)
self.pic_button.clicked.connect(self.setProgressBarValue)
# 设置投屏线程
def getDeviceScreen(self):
self.mydeviceScreen = GetPicByAir()
self.mydeviceScreen.start()
# 设置进度条线程
def setProgressBarValue(self):
self.thread_setprogressbar_value = SendProgressBarSignal()
self.thread_setprogressbar_value.progressBarValue.connect(self.progressbarSignal2Value)
self.thread_setprogressbar_value.start()
def progressbarSignal2Value(self, i):
self.progressBar.setValue(i)
if __name__ == "__main__":
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QtWidgets.QApplication(sys.argv)
mainui = MyMainWindow()
mainui.show()
sys.exit(app.exec_())
子进程只负责发射信号,progressbar的value由主进程负责修改,这样就不会报错。