Когда я обновляю QPixmap для QGraphicsPixmapItem, изображение исчезает со сцены - PullRequest
0 голосов
/ 17 марта 2020

У меня есть эта простая сцена, показывающая QGraphicsPixmapItem. Я периодически обновляю его содержимое с QThread. При первом обновлении отображается правильно. Однако во второй раз изображение исчезает. Есть идеи почему?

import numpy as np
from PyQt5.QtCore import QThread
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QGraphicsPixmapItem, QGraphicsScene, QGraphicsView, QMainWindow
import sys

app = QApplication([])
window = QMainWindow()
window.setGeometry(100, 100, 400, 400)
view = QGraphicsView()
scene = QGraphicsScene()
gpix = QGraphicsPixmapItem()
scene.addItem(gpix)
view.setScene(scene)
window.setCentralWidget(view)
window.show()

class Thread(QThread):
  def run(self):
    while True:
      im = np.random.randint(255, size=(256, 256), dtype=np.uint8)
      qim = QImage(im, im.shape[1], im.shape[0], QImage.Format_Grayscale8)
      pix = QPixmap.fromImage(qim)
      gpix.setPixmap(pix)
      self.sleep(1)

thread = Thread()
thread.finished.connect(app.exit)
thread.start()
sys.exit(app.exec_())

1 Ответ

2 голосов
/ 17 марта 2020

Есть две основные проблемы c. Во-первых, вы потенциально получаете доступ к одной и той же переменной gpix одновременно из нескольких потоков. Во-вторых, вы пытаетесь использовать QPixmap из вторичного потока (потока, отличного от того, в котором работает main).

Для решения первой проблемы вы можете использовать сигнал / слот для уведомления основного Поток, что новое изображение доступно.

Для второй проблемы вы можете отложить создание QPixmap от QImage до точки, в которой сигнал обрабатывается.

import numpy as np
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QGraphicsPixmapItem, QGraphicsScene, QGraphicsView, QMainWindow
import sys

app = QApplication([])
window = QMainWindow()
window.setGeometry(100, 100, 400, 400)
view = QGraphicsView()
scene = QGraphicsScene()
gpix = QGraphicsPixmapItem()
scene.addItem(gpix)
view.setScene(scene)
window.setCentralWidget(view)
window.show()

class Thread(QThread):

    # Add a signal that accepts a QImage.
    sig_new_image = pyqtSignal(QImage)

    def run(self):
        while True:
            im = np.random.randint(255, size=(256, 256), dtype=np.uint8)
            qim = QImage(im, im.shape[1], im.shape[0], QImage.Format_Grayscale8)
            pix = QPixmap.fromImage(qim)

            # Emit the signal with the new QImage.
            self.sig_new_image.emit(qim)
            self.sleep(1)

thread = Thread()
thread.finished.connect(app.exit)

# Connect the Thread.sig_new_image signal to a lambda that will update
# the pixmap accordingly.
thread.sig_new_image.connect(lambda i: gpix.setPixmap(QPixmap.fromImage(i)))
thread.start()
sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...