簡體   English   中英

QQuickPaintedItem崩潰不渲染怎么解決?

[英]How to solve QQuickPaintedItem crash and not rendering?

我嘗試顯示預處理圖像的 stream 所以我創建了一個自定義QQuickPaintedItem來繪制圖像問題是當圖像更改時,沒有任何反應只是應用程序崩潰但 paint 方法的打印語句仍然打印,鼠標 cursor 看起來像+標志。

這是我來自QQuickPaintedItemLiveCamera子類

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同樣的問題,所以有更好的方法嗎?

這是應用程序崩潰時刻:Python 沒有響應

根據屏幕截圖,這不是崩潰。 該程序似乎太忙(在主/GUI 線程上)無法響應用戶交互,導致 Windows 表示應用程序沒有響應。

要調試這樣的問題,應該使用調試器,暫停程序,看看他在做什么(在主線程上)。

在這種情況下,問題在於您在主線程內運行CamThread::run (執行無限循環),而不是按預期在單獨的線程上運行它。 您不應顯式調用QThread::run ,而應調用QThread::start ,這將啟動一個新線程並在該新線程上執行QThread::run function。

請注意, QThread::quit在您的情況下不執行任何操作,因為通過重新實現QThread::runQEventLoop不會在該線程上啟動。 您應該啟動事件循環,或者您應該實現自己的信號,以中斷CamThread::run內的無限循環,讓線程優雅地完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM