Как добавить изображение на qgraphicsview?
Я хочу, чтобы по нажатию на кнопку можно было через диалоговое окно выбрать изображение, которое необходимо поместить на qgraphicsview.
Создал интерфейс, через Qt Designer - файл mainwindow.ui. На форме есть кнопка open_im и qgraphicsview - srcGraphicsView. после выбора изображения получаю ошибку и программа вылетает. подскажите, пожалуйста, что я не так делаю?
from PyQt5 import uic, QtCore, QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsItem, QGraphicsScene, QGraphicsView, QFileDialog
from PyQt5.QtGui import QPixmap
Form, Window = uic.loadUiType("mainwindow.ui")
app = QApplication([])
window = Window()
form = Form()
form.setupUi(window)
window.show()
def open():
fname = QFileDialog.getOpenFileName()
pixmap = QGraphicsItem(QPixmap(fname))
form.srcGraphicsView.addItem(pixmap)
form.open_im.clicked.connect(open)
app.exec()
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
Класс
QGraphicsPixmapItemпредоставляет элемент растрового изображения, который вы можете добавить вQGraphicsScene.
Больше https://doc.qt.io/qt-5/qgraphicspixmapitem.html#details
import sys
from PyQt5.Qt import *
class GraphicsView(QGraphicsView):
def __init__(self):
super(GraphicsView, self).__init__()
self.resize(400, 400)
self.scene = QGraphicsScene()
self.scene.setSceneRect(0, 0, 400, 400)
self.pic = QGraphicsPixmapItem()
self.pic.setPixmap(QPixmap('Ok.png').scaled(60, 60))
# позволяет выбирать его и перемещать
self.pic.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable)
# установить смещение изображения от начала координат сцены
self.pic.setOffset(170, 170)
self.text = QGraphicsTextItem()
self.text.setPlainText('Hello QGraphicsPixmapItem')
self.text.setDefaultTextColor(QColor('#91091e')) # для установки цвета текста
# setPos - для установки положения текстовых примитивов относительно начала координат сцены
self.text.setPos(130, 230)
self.scene.addItem(self.pic)
self.scene.addItem(self.text)
self.setScene(self.scene)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.graphicsView = GraphicsView()
self.open_im = QPushButton('Add image')
self.open_im.clicked.connect(self.addImage)
layout = QVBoxLayout(self.centralWidget)
layout.addWidget(self.graphicsView)
layout.addWidget(self.open_im)
def addImage(self):
# pixmap = QGraphicsItem(QPixmap(fname))
# form.srcGraphicsView.addItem(pixmap)
fname, _ = QFileDialog.getOpenFileName(
self, 'Open file', '.', 'Image Files (*.png *.jpg *.bmp)')
if fname:
pic = QGraphicsPixmapItem()
pic.setPixmap(QPixmap(fname).scaled(160, 160))
pic.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable)
pic.setOffset(12, 12)
self.graphicsView.scene.addItem(pic)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = MainWindow() #Demo()
demo.show()
sys.exit(app.exec_())
Автор решения: Alex
→ Ссылка
решил задачу по-своему. через обращение к уже существующим объектам.
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
pic_left = QGraphicsPixmapItem()
pic_right = QGraphicsPixmapItem()
def open_image():
src = QGraphicsScene()
dst = QGraphicsScene()
ui.srcGraphicsView.setScene(src)
ui.dstGraphicsView.setScene(dst)
filename = QFileDialog.getOpenFileName()[0]
if filename:
pic_left.setPixmap(QPixmap(filename))
ui.srcGraphicsView.scene().addItem(pic_left)
pic_right.setPixmap(QPixmap(filename))
ui.dstGraphicsView.scene().addItem(pic_right)
ui.open_im.clicked.connect(open_image)
sys.exit(app.exec_())
