как добавить изображение в класс QGraphicsScene с помощью растрового изображения

Здесь я создал сетку в классе Q Graphics Scene и хочу добавить изображение в каждую ячейку сетки, так что не могли бы вы мне помочь. как я могу добавить изображение в каждую ячейку сетки

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)

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


person navya sri    schedule 01.10.2018    source источник
comment
Вы хотите взаимодействовать с элементом или просто хотите, чтобы он был фоновым изображением?   -  person eyllanesc    schedule 01.10.2018
comment
Мне не нужно фоновое изображение, сэр, я хочу добавить изображение в каждую ячейку сетки, я так много пробовал, но не получил   -  person navya sri    schedule 01.10.2018
comment
ладно, а меш ты хочешь сделать фоновым изображением или ты будешь двигать линии?   -  person eyllanesc    schedule 01.10.2018
comment
Я думаю, вы не поняли мой вопрос, будучи фоновым изображением, вы также можете рисовать в ячейке, но недостаток в том, что вы не можете двигаться с помощью мыши, а преимущество в том, что это более низкая стоимость, поэтому я прошу вас.   -  person eyllanesc    schedule 01.10.2018
comment
Да, сэр, я хочу фоновое изображение   -  person navya sri    schedule 01.10.2018
comment
Когда вы говорите: да, сэр, я хочу так, я вас не понимаю, в своем ответе я покажу вам несколько вариантов, и вы будете использовать тот, который хотите, это нормально?, с другой стороны Я ответил на другой ваш вопрос, и я не знаю, был ли он вам полезен, и если он вам помог, не забудьте отметить его как правильный.   -  person eyllanesc    schedule 01.10.2018
comment
хорошо, спасибо, сэр   -  person navya sri    schedule 01.10.2018


Ответы (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_())
person eyllanesc    schedule 01.10.2018
comment
большое спасибо, сэр .. я новичок в pyqt4, но я хочу изучить все концепции, не могли бы вы предложить мне хорошую книгу - person navya sri; 01.10.2018
comment
@GouthamySri Я не знаю ни одной книги, я могу предложить документы QT, хотя это для C ++, концепции применяются к PyQt, с другой стороны, если вы учитесь, лучше изучить PyQt5, PyQt4 устарел, я научился поддерживать старые проекты. С другой стороны, вы проголосовали за меня, и другое дело - пометить его как правильное, если бы вы это сделали, я был бы вам очень благодарен, если вы не знаете, как это сделать, просмотрите тур. Наконец, просмотрите старые ответы SO, во многих из них мы объясняем концепции. - person eyllanesc; 01.10.2018