วิธีเพิ่มรูปภาพลงในคลาส QGraphicsScene โดยใช้ pixmap

ที่นี่ฉันสร้างตารางในคลาส 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