使用mousewheelevent输出更新qgraphicsscene

时间:2021-02-07 23:03:50

I have a set of images that I want to be able to scroll through. The below code works for me on Mac, such that I can scroll on the visible widget. Printing "count" results in a visible rising or lowering number in the python output. However, I wish to use "count" to update the image and I am kinda stuck on how.

我有一组我想要滚动的图像。下面的代码适用于我在Mac上的工作,这样我就可以在可见的小部件上滚动。打印“count”会导致python输出中出现明显的上升或下降的数字。但是,我希望使用“count”来更新图像,我有点被困在了如何。

The main question is: How can I use the constantly varying variable "count" from my mousewheel function, and use it to update the image shown in the DCMViewer? I expect some kind of signal to work, but haven't got it working and I'm stuck. Any help is much appreciated.

主要问题是:如何使用鼠标滚轮函数中不断变化的变量“count”,并使用它更新DCMViewer中显示的图像?我希望能有某种工作的信号,但还没有成功,我被困住了。非常感谢您的帮助。

class DCMViewer(QGraphicsView):
    def __init__(self):
        super(DCMViewer, self).__init__()

        # Create a QGraphicsScene
        self.scene = QGraphicsScene()

        # Provide image in normalized double format
        image = np.double(dcmIm)
        image *= 255.0 / image.max()
        image = QPixmap.fromImage(qimage2ndarray.array2qimage(image))
        image = QGraphicsPixmapItem(image)

        # Add the image to the QGraphicsScene window
        self.scene.addItem(image)

        # Initiate the scene
        self.setScene(self.scene)

    # Create a mousewheelevent to scroll through images
    def wheelEvent(self, QWheelEvent):
        super(DCMViewer, self).wheelEvent(QWheelEvent)
        global count
        wheelcounter = QWheelEvent.angleDelta()
        if wheelcounter.y() / 120 == -1:
            count += 1
            if count >= 21:
                count = 21
        elif wheelcounter.y() / 120 == 1:
            count -= 1
            if count <= 0:
                count = 0

class Mainwidget(QMainWindow):
    def __init__(self):
        super(Mainwidget, self).__init__()

        # self.initUI()
        image_viewer = DCMViewer()
        self.setCentralWidget(image_viewer)
        self.showFullScreen()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Mainwidget()
    win.showFullScreen()
    sys.exit(app.exec_())

1 个解决方案

#1


0  

To be able to make an item visible, the first task we must do is to identify it, for that we could establish an id for each item. We use the setData() and data() method, then we use the fitInView() method to scale the window to the item, this does not make the item totally visible because if there is another item on it we will get an unwanted output, for that we use setZValue(), the higher the value of Z will be on top of another item, your code will not provide an example that can be tested correctly so create my own example:

要使一个条目可见,我们必须做的第一件事就是识别它,因为我们可以为每个条目建立一个id。我们使用setData()和数据()方法,然后使用fitInView规模()方法的窗户,这并不使项目完全可见,因为如果还有另一个项目,我们将得到一个不需要的输出,我们使用setZValue(),高Z的值将在另一个项目,您的代码将不会提供一个例子,可以正确地创建我自己的例子进行测试:

import sys

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class DCMViewer(QGraphicsView):
    def __init__(self):
        super(DCMViewer, self).__init__()
        self.currentId = 0
        self.maxId = 0
        self.setScene(QGraphicsScene())
        directory = QStandardPaths.writableLocation(QStandardPaths.PicturesLocation)
        it = QDirIterator(directory, QDir.Files)

        while it.hasNext():
            pixmap = QPixmap(it.next())
            item = QGraphicsPixmapItem(pixmap)
            item.setData(0, self.maxId)
            self.scene().addItem(item)
            self.maxId += 1

    def scrollToItem(self, id):
        for item in self.scene().items():
            if item.data(0) == id:
                item.setZValue(1)
                self.fitInView(item)
            else:
                item.setZValue(0)

    def wheelEvent(self, event):
        wheelcounter = event.angleDelta()
        if wheelcounter.y() / 120 == -1:
            self.currentId += 1
            if self.currentId > self.maxId:
                self.currentId = self.maxId -1
        elif wheelcounter.y() / 120 == 1:
            self.currentId -= 1
            if self.currentId <= 0:
                self.currentId = 0
        self.scrollToItem(self.currentId)


class Mainwidget(QMainWindow):
    def __init__(self):
        super(Mainwidget, self).__init__()
        image_viewer = DCMViewer()
        self.setCentralWidget(image_viewer)
        self.showFullScreen()
        image_viewer.scrollToItem(0)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Mainwidget()
    sys.exit(app.exec_())

#1


0  

To be able to make an item visible, the first task we must do is to identify it, for that we could establish an id for each item. We use the setData() and data() method, then we use the fitInView() method to scale the window to the item, this does not make the item totally visible because if there is another item on it we will get an unwanted output, for that we use setZValue(), the higher the value of Z will be on top of another item, your code will not provide an example that can be tested correctly so create my own example:

要使一个条目可见,我们必须做的第一件事就是识别它,因为我们可以为每个条目建立一个id。我们使用setData()和数据()方法,然后使用fitInView规模()方法的窗户,这并不使项目完全可见,因为如果还有另一个项目,我们将得到一个不需要的输出,我们使用setZValue(),高Z的值将在另一个项目,您的代码将不会提供一个例子,可以正确地创建我自己的例子进行测试:

import sys

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class DCMViewer(QGraphicsView):
    def __init__(self):
        super(DCMViewer, self).__init__()
        self.currentId = 0
        self.maxId = 0
        self.setScene(QGraphicsScene())
        directory = QStandardPaths.writableLocation(QStandardPaths.PicturesLocation)
        it = QDirIterator(directory, QDir.Files)

        while it.hasNext():
            pixmap = QPixmap(it.next())
            item = QGraphicsPixmapItem(pixmap)
            item.setData(0, self.maxId)
            self.scene().addItem(item)
            self.maxId += 1

    def scrollToItem(self, id):
        for item in self.scene().items():
            if item.data(0) == id:
                item.setZValue(1)
                self.fitInView(item)
            else:
                item.setZValue(0)

    def wheelEvent(self, event):
        wheelcounter = event.angleDelta()
        if wheelcounter.y() / 120 == -1:
            self.currentId += 1
            if self.currentId > self.maxId:
                self.currentId = self.maxId -1
        elif wheelcounter.y() / 120 == 1:
            self.currentId -= 1
            if self.currentId <= 0:
                self.currentId = 0
        self.scrollToItem(self.currentId)


class Mainwidget(QMainWindow):
    def __init__(self):
        super(Mainwidget, self).__init__()
        image_viewer = DCMViewer()
        self.setCentralWidget(image_viewer)
        self.showFullScreen()
        image_viewer.scrollToItem(0)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Mainwidget()
    sys.exit(app.exec_())