#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() ?