【问题标题】:how to add image into QGraphicsScene class by using pixmap如何使用 pixmap 将图像添加到 QGraphicsScene 类中
【发布时间】:2019-03-06 11:55:16
【问题描述】:

在这里,我在 Q 图形场景类中创建了一个网格,我想在网格中的每个单元格中添加一个图像,所以请你帮帮我。如何在网格的每个单元格中添加图像

class QS(QtGui.QGraphicsScene):
        def __init__(self, *args, **kwargs):
        super(QS, self).__init__(*args, **kwargs)

        # self.grview = QtGui.QGraphicsView()
        self.scene = QtGui.QGraphicsScene()
        self.scene.addPixmap(QtGui.QPixmap('pradeep.jpg'))
        self.grview.setScene(self.scene)



        print "Inserted in QS col = {}, row = {}".format(X,Y)

        width = X * Setting.WIDTH
        height = Y * Setting.HEIGHT
        self.setSceneRect(0, 0, width, height)

        self.setItemIndexMethod(QtGui.QGraphicsScene.NoIndex)

        for x in range(0,X+1):
            xc = x * Setting.WIDTH
            self.addLine(xc,0,xc,height)
            self.scene.addPixmap(QtGui.QPixmap('pradeep.jpg'))
            # self.addPixmap(self.pixmap)


        for y in range(0,Y+1):
            yc = y * Setting.HEIGHT
            self.addLine(0,yc,width,yc)
            self.scene.addPixmap(QtGui.QPixmap('pradeep.jpg'))
            # self.addPixmap(self.pixmap)

        # for x in range(0,X+1):
        #     for y in range(0,Y+1):
        #         self.addPixmap(0,y,imag)

class QV(QtGui.QGraphicsView, QtGui.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(QV, self).__init__(*args, **kwargs)

我的网格图像如下所示

【问题讨论】:

  • 您想与该项目进行交互,还是只想将其作为背景图像?
  • 先生,我不想要背景图像,我想将图像添加到网格中的每个单元格中,我尝试了很多方法,但我没有得到
  • 好的,网格是你想作为背景图片还是要移动线条?
  • 我想你还没有理解我的问题,作为背景图也可以在单元格中绘制,但缺点是不能用鼠标移动,但优点是成本较低,所以我问你。
  • 是的先生,我想要背景图片

标签: python python-3.x pyqt pyqt4 qgraphicsview


【解决方案1】:

您的问题可以有多种解释,所以我将展示几个选项:

1. 如果您不打算与项目进行交互,例如您不想移动、选择、旋转等,则不需要使用项目,在这种情况下最好使用drawBackground(),因为一个项目比一个简单的绘制消耗更多的资源。

import sys
from PyQt4 import QtCore, QtGui


class Setting:
    WIDTH = 80
    HEIGHT = 80

X, Y = 7, 5


class QS(QtGui.QGraphicsScene):
    def __init__(self, parent=None):
        super(QS, self).__init__(QtCore.QRectF(0, 0, X * Setting.WIDTH, Y * Setting.HEIGHT), parent)

    def drawBackground(self, painter, rect):
        width = X * Setting.WIDTH
        height = Y * Setting.HEIGHT

        l = QtCore.QLineF(QtCore.QPointF(0, 0), QtCore.QPointF(width, 0))
        for _ in range(Y+1):
            painter.drawLine(l)
            l.translate(0, Setting.HEIGHT)

        l = QtCore.QLineF(QtCore.QPointF(0, 0), QtCore.QPointF(0, height))
        for _ in range(X+1):
            painter.drawLine(l)
            l.translate(Setting.WIDTH, 0)

        pixmap = QtGui.QPixmap("pradeep.png").scaled(Setting.WIDTH, 
            Setting.HEIGHT, 
            QtCore.Qt.IgnoreAspectRatio,
            QtCore.Qt.SmoothTransformation)

        p = QtCore.QPointF()
        for i in range(X):
            p = QtCore.QPointF(Setting.WIDTH*i, 0)
            for j in range(Y):
                painter.drawPixmap(p, pixmap)
                p += QtCore.QPointF(0, Setting.HEIGHT)


class QV(QtGui.QGraphicsView):
    pass


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        scene = QS(self)
        view = QV(scene)
        self.setCentralWidget(view)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

2.如果您想与图像进行交互,您可以使用QGraphicsPixmapItem,或两者的组合:

import sys
from PyQt4 import QtCore, QtGui


class Setting:
    WIDTH = 80
    HEIGHT = 80

X, Y = 7, 5


class QS(QtGui.QGraphicsScene):
    def __init__(self, parent=None):
        super(QS, self).__init__(QtCore.QRectF(0, 0, X * Setting.WIDTH, Y * Setting.HEIGHT), parent)

        pixmap = QtGui.QPixmap("pradeep.png").scaled(Setting.WIDTH, 
            Setting.HEIGHT, 
            QtCore.Qt.IgnoreAspectRatio,
            QtCore.Qt.SmoothTransformation)

        p = QtCore.QPointF()
        for i in range(X):
            p = QtCore.QPointF(Setting.WIDTH*i, 0)
            for j in range(Y):
                it = self.addPixmap(pixmap)
                it.setPos(p)
                p += QtCore.QPointF(0, Setting.HEIGHT)

    def drawBackground(self, painter, rect):
        width = X * Setting.WIDTH
        height = Y * Setting.HEIGHT

        l = QtCore.QLineF(QtCore.QPointF(0, 0), QtCore.QPointF(width, 0))
        for _ in range(Y+1):
            painter.drawLine(l)
            l.translate(0, Setting.HEIGHT)

        l = QtCore.QLineF(QtCore.QPointF(0, 0), QtCore.QPointF(0, height))
        for _ in range(X+1):
            painter.drawLine(l)
            l.translate(Setting.WIDTH, 0)


class QV(QtGui.QGraphicsView):
    pass


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        scene = QS(self)
        view = QV(scene)
        self.setCentralWidget(view)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

【讨论】:

  • 非常感谢先生 .. 我是 pyqt4 的初学者,但我想学习所有概念,你能推荐我一本好书吗
  • @GouthamySri 我不知道任何书,我可以推荐 QT 文档,虽然它是针对 C++ 的,但这些概念适用于 PyQt,另一方面,如果你正在学习,最好你学习 PyQt5,PyQt4 已弃用,我学习它是为了维护旧项目。另一方面,您给了我一个赞成票,另一件事是将其标记为正确,如果您这样做了,我将非常感谢您,如果您不知道该怎么做,请查看tour。最后,回顾一下旧的 SO 答案,其中许多我们解释了概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多