Как поместить несколько QPixmap в класс, который наследуется от QtWidgets.QGraphicsPixmapItem?

#python #pyqt

#python #pyqt

Вопрос:

Сегодня я застрял с QPixmap. Мой класс наследуется от QtWidgets.QGraphicsPixmapItem и, как в примере ниже.

 class graphicButton(QtWidgets.QGraphicsPixmapItem):
    def __init__(self):
        pixmapA = QtGui.QPixmap(r"img.png")

        QtWidgets.QGraphicsPixmapItem.__init__(self, pixmapA)
        self.setFlags(
            self.flags( )
            | QtWidgets.QGraphicsItem.ItemIsSelectable
            | QtWidgets.QGraphicsItem.ItemIsMovable
        )
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            print("mouse left press")
            event.accept()
        elif event.button() == QtCore.Qt.RightButton:
            print("mouse right press")
            event.accept()
        elif event.button() == QtCore.Qt.MidButton:
            print("mouse middle press")
            event.accept()
  

Он работает нормально, но что, если я хочу поместить более одного изображения? В большинстве случаев, которые я нашел в Google, вам нужно создать несколько QGraphicsPixmapItems . В этом случае я больше не могу наследовать от QGraphicsPixItem, и мне нужно перейти на QGraphicsItem или я что-то упускаю?

Комментарии:

1. Сколько изображений вы хотите разместить? и как вы хотите, чтобы они были размещены?, то есть, вы хотите, чтобы это было похоже на матрицу? если да, то сколько строк или столбцов?

2. Я хочу сделать что-то вроде человека из изображений, которые будут кнопками. Итак, я бы сказал, что около 30-40 изображений, которые будут размещены в форме человека в QGraphicsView.

3. Я никогда не пытался использовать матрицы в программировании, поэтому вряд ли могу представить себе, как это выглядит.

Ответ №1:

Простое решение — загрузить изображение, связанное с его положением, например, в следующем случае я размещаю изображения в вершинах пятиугольника:

 import random
from PyQt5 import QtCore, QtGui, QtWidgets


class GraphicsButton(QtWidgets.QGraphicsPixmapItem):
    def __init__(self, name, pixmap, parent=None):
        super(GraphicsButton, self).__init__(pixmap, parent)
        self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
        self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
        self._name = name

    @property
    def name(self):
        return self._name

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            print("mouse left press")
        elif event.button() == QtCore.Qt.RightButton:
            print("mouse right press")
        elif event.button() == QtCore.Qt.MidButton:
            print("mouse middle press")
        print(self.name)
        super(GraphicsButton, self).mousePressEvent(event)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        scene = QtWidgets.QGraphicsScene()
        view = QtWidgets.QGraphicsView(scene)
        self.setCentralWidget(view)
        # coordinates of the pentagon
        datas = [
            ("name1", "img0.png", QtCore.QPointF(0, -200)),
            ("name2", "img1.png", QtCore.QPointF(-190, -62)),
            ("name3", "img2.png", QtCore.QPointF(-118, 162)),
            ("name4", "img3.png", QtCore.QPointF(118, 162)),
            ("name5", "img0.png", QtCore.QPointF(190, -62)),
        ]
        for name, path, position in datas:
            item = GraphicsButton(name, QtGui.QPixmap(path))
            scene.addItem(item)
            item.setPos(position)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
  

введите описание изображения здесь

Комментарии:

1. Кстати, вы знаете, как запросить, какой элемент был нажат? Что-то вроде ‘event.clicked’ или ‘event.selected’, потому что я усердно изучал QEvent, но не смог найти ничего полезного.

2. @Vlad Что вы хотите, чтобы происходило при нажатии? Как вы идентифицируете каждый элемент? Есть ли у каждого элемента идентификатор?

3. На данный момент я просто хочу, чтобы он печатал (виджет (изображение), на который был нажат), и в будущем менял изображение на другое, но пока я хочу хотя бы понять, как определить, что нажато. Что касается идентификатора элементов, я читал об этом, но я подумал, что могу просто запросить, что было нажато, и внести изменения уже в соответствии с информацией, которую он вернет. Я думаю, это невозможно, не указав каждому элементу идентификатор?

4. @Vlad Что вы имеете в widget(image) виду?, вы могли бы привести пример. При обработке многих элементов должен быть указан идентификатор, поскольку это делает работу масштабируемой

5. Извините, что сбил вас с толку, под виджетом (изображением) я имел в виду просто изображение. В моей голове, поскольку это QtWidgets. QGraphicsSceneItem , я сказал виджет. Под идентификатором вы подразумеваете id() или item.setData() ?