如何解决pyqt 多线程:为什么工作线程阻塞主线程
当我尝试加载一些 size
>10MB 或 pages
>300 的 .pdf 时,
工作线程会阻塞主线程,我不知道如何正确使用QThread
,
我希望每次 pixmap_page_load
运行时,都将信号发送到主线程。
import time
from PyQt5.QtCore import QRectF,Qt,pyqtSignal,QThread
from PyQt5.QtGui import QColor,QBrush,QPen,QImage,Qpixmap
from PyQt5.QtWidgets import QApplication,QGraphicslineItem,QMainWindow,QGraphicsScene,QGraphicsView,QGraphicsItem,\
QFileDialog
from fitz import fitz
def pixmap_page_load(doc:"fitz.Document",pagenum,ratio=1):
page:"fitz.Page" = doc.load_page(pagenum) # 加载的是页面
pix:"fitz.pixmap" = page.getpixmap(matrix=fitz.Matrix(ratio,ratio)) # 将页面渲染为图片
fmt = QImage.Format_RGBA8888 if pix.alpha else QImage.Format_RGB888 # 渲染的格式
pageImage = QImage(pix.samples,pix.width,pix.height,pix.stride,fmt)
pixmap = Qpixmap()
pixmap.convertFromImage(pageImage) # 转为pixmap
return Qpixmap(pixmap)
class MyGraphicRect2(QGraphicsItem):
def __init__(self,x,y,width,height):
super().__init__()
self.x = x
self.y = y
self.width = width
self.height = height
self.setPos(self.x,self.y)
self.color = QColor('red')
self.setAcceptDrops(True)
self.setCursor(Qt.OpenHandCursor)
self.setFlag(QGraphicsItem.ItemIsSelectable,True)
self.setFlag(QGraphicsItem.ItemIsMovable,True)
self.setFlag(QGraphicsItem.ItemIsFocusable,True)
self.setAcceptHoverEvents(True)
def setColor(self,color):
self.color = QColor(color)
def boundingRect(self):
return QRectF(self.x,self.y,self.width,self.height)
def paint(self,painter,options,widget):
painter.setPen(QPen(QColor('black')))
painter.setBrush(self.color)
painter.drawRect(self.x,self.height)
class MoveThread(QThread):
s = pyqtSignal(float,float)
def __init__(self,directory):
super().__init__()
self.directory=directory
def run(self):
doc= fitz.open(self.directory)
for i in range(1,len(doc)):
pixmap = pixmap_page_load(doc,i)
self.s.emit(i,0)
class MyGraphicScene(QMainWindow):
def __init__(self):
super().__init__()
self.rect=QRectF(0,800,800)
self.Scene=QGraphicsScene(self.rect)
self.View=QGraphicsView()
self.View.setCacheMode(QGraphicsView.CacheNone)
self.sceneConfig()
self.displayUI()
def sceneConfig(self):
self.Scene.setBackgroundBrush(QBrush(QColor('yellow'),Qt.solidPattern))
self.item1=MyGraphicRect2(100,100,100)
self.Scene.addItem(self.item1)
line=QGraphicslineItem(80,38,84,38)
self.Scene.addItem(line)
self.View.setScene(self.Scene)
def updatePosition(self,y):
item1 = MyGraphicRect2(100+x,100+y,100)
self.Scene.addItem(item1)
def displayUI(self):
print('Is scene active',self.Scene.isActive())
directory,_ = QFileDialog.getopenFileName(None,"选取文件",".","(*.pdf)")
self.setCentralWidget(self.View)
self.th=MoveThread(directory)
self.th.s.connect(self.updatePosition)
self.th.start()
self.resize(1000,1000)
self.show()
if __name__ == "__main__":
import sys
app=QApplication(sys.argv)
m=MyGraphicScene()
sys.exit(app.exec_())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。