[英]How to solve NoReverseMatch at / (Error during template rendering) in django 3.2?
[英]How to solve QQuickPaintedItem crash and not rendering?
我嘗試顯示預處理圖像的 stream 所以我創建了一個自定義QQuickPaintedItem
來繪制圖像問題是當圖像更改時,沒有任何反應只是應用程序崩潰但 paint 方法的打印語句仍然打印,鼠標 cursor 看起來像+
標志。
這是我來自QQuickPaintedItem
的LiveCamera
子類
class LiveCamera(QQuickPaintedItem):
imageChanged=Signal(QImage)
def __init__(self):
super().__init__()
self.setRenderTarget(QQuickPaintedItem.FramebufferObject)
self.m_image = QImage("C://Users//Hassan//Documents//python-gui-projects//PortMafiaSecurity//images//loading.jpg")
def paint(self,painter: QPainter):
print('hey')
if self.m_image.isNull(): return
img = self.m_image.scaled(self.size().toSize(),Qt.KeepAspectRatioByExpanding ,Qt.SmoothTransformation)
painter.drawPixmap(QPoint(),QPixmap.fromImage(img))
@Property(QImage, notify=imageChanged)
def image(self):
return self.m_image
@image.setter
def image(self, image):
if self.m_image == image: return
self.m_image = image
self.imageChanged.emit(self.m_image)
#self.paint(QPainter())
self.update()
這是main.py
class CamThread(QThread):
def __init__(self,UI):
super().__init__()
self.UI=UI
def run(self):
cap = open_images_capture(args.input, args.loop)
frame_processor = FrameProcessor(args)
frame_num = 0
output_transform = None
while True:
start_time = perf_counter()
frame = cap.read()
if frame_num == 0:
output_transform = OutputTransform(frame.shape[:2], args.output_resolution)
detections = frame_processor.process(frame)
frame = draw_detections(frame, frame_processor, detections, output_transform)
frame_num += 1
h, w, ch = frame.shape
p = QImage(frame.data, h, w,QImage.Format_RGB888)
self.UI.changeImage.emit(p)
class MainThread(QObject):
def __init__(self):
QObject.__init__(self)
self.cam=CamThread(self)
changeImage=Signal(QImage)
@Slot(bool)
def click(self,first):
if first:
self.cam.run()
else:
self.cam.quit()
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
main = MainThread()
engine.rootContext().setContextProperty("cam_recording", main)
qmlRegisterType(LiveCamera, "LiveCameraPlugin", 1, 0, "LiveCamera")
engine.load(os.fspath(Path(__file__).resolve().parent / "qml/main.qml"))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
這是Qml
Rectangle{
x: 72
y: 84
width: 649
height: 366
LiveCamera{
id:camera
anchors.fill: parent
}
}
LeftMenuBtn {
//some stuff
}
Connections{
target: cam_recording
function onChangeImage(img){
camera.image=img
}
}
有沒有辦法解決這個問題,我嘗試了很多來尋找解決方案,但我也沒有找到它,我也嘗試過QtQuickImageProvider
同樣的問題,所以有更好的方法嗎?
根據屏幕截圖,這不是崩潰。 該程序似乎太忙(在主/GUI 線程上)無法響應用戶交互,導致 Windows 表示應用程序沒有響應。
要調試這樣的問題,應該使用調試器,暫停程序,看看他在做什么(在主線程上)。
在這種情況下,問題在於您在主線程內運行CamThread::run
(執行無限循環),而不是按預期在單獨的線程上運行它。 您不應顯式調用QThread::run
,而應調用QThread::start
,這將啟動一個新線程並在該新線程上執行QThread::run
function。
請注意, QThread::quit
在您的情況下不執行任何操作,因為通過重新實現QThread::run
, QEventLoop
不會在該線程上啟動。 您應該啟動事件循環,或者您應該實現自己的信號,以中斷CamThread::run
內的無限循環,讓線程優雅地完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.