как добавить изображение по одному в каждую ячейку сетки с помощью кнопки - PullRequest
0 голосов
/ 03 октября 2018

Я хочу добавить изображение по одному в столбцах каждой ячейки в сетке.Здесь я создал кнопку.Когда я нажимаю кнопку, одно изображение будет добавлено в ячейку сетки.Когда я нажимаю кнопку, я хочу добавить изображение в еще одну ячейку сетки. Этот процесс будет продолжаться до конца ячеек сетки.Как я могу сделать это с pyqt4?Моя текущая попытка ниже:

import sys
from PyQt4 import QtCore, QtGui


class Setting:
    WIDTH = 100
    HEIGHT = 100
X, Y = 5, 3


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("image.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 Example(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        scene = QS(self)
        view = QV(scene)
        self.vbox=QtGui.QVBoxLayout()
        self.btn=QtGui.QPushButton("measure")
        # self.btn.clicked.connect(self.showimage)
        self.vbox.addWidget(self.btn)
        self.vbox.addWidget(view)


        self.setLayout(self.vbox)
        # self.setCentralWidget(view)



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

1 Ответ

0 голосов
/ 03 октября 2018

Используйте drawBackground() для рисования перманента, в случае изображений лучше добавить его к сцене через addPixmap(), как я покажу ниже:

import sys
from PyQt4 import QtCore, QtGui


class QS(QtGui.QGraphicsScene):
    def __init__(self, xcells, ycells, size, parent = None):
        super(QS, self).__init__(QtCore.QRectF(0, 0, xcells*size.width(), ycells*size.height()), parent)
        self._xcells = xcells
        self._ycells = ycells
        self._size_cell = size

    def drawBackground(self, painter, rect):
        width = self._xcells*self._size_cell.width()
        height = self._ycells*self._size_cell.height()

        l = QtCore.QLineF(QtCore.QPointF(0, 0), QtCore.QPointF(width, 0))
        for _ in range(self._ycells+1):
            painter.drawLine(l)
            l.translate(0, self._size_cell.height())

        l = QtCore.QLineF(QtCore.QPointF(0, 0), QtCore.QPointF(0, height))
        for _ in range(self._xcells+1):
            painter.drawLine(l)
            l.translate(self._size_cell.width(), 0)


class QV(QtGui.QGraphicsView):
    def __init__(self, parent=None):
        super(QV, self).__init__(parent)
        self.size_cell = QtCore.QSize(100, 100)
        self.xcells, self.ycells  = 5, 3
        scene = QS(self.xcells, self.ycells, self.size_cell, self)
        self.setScene(scene)
        self._i = 0
        self._j = 0

    def add_pixmap(self, pixmap):
        if self._i*self._j < self.xcells*self.ycells:
            it = self.scene().addPixmap(pixmap.scaled(self.size_cell, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation))
            pos = QtCore.QPointF(self._j*self.size_cell.width(), self._i*self.size_cell.height())
            it.setPos(pos)
            self._i += 1

            if self._i % self.ycells == 0:
                self._j, self._i = self._j + 1, 0


class Example(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)

        self.view = QV()
        btn = QtGui.QPushButton("measure")
        btn.clicked.connect(self.on_clicked)

        vbox = QtGui.QVBoxLayout(self)
        vbox.addWidget(btn)
        vbox.addWidget(self.view)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        filename =  QtGui.QFileDialog.getOpenFileName(self, 
            "Open Image", 
            QtCore.QDir.currentPath(),
            "Image Files (*.png *.jpg *.bmp)")
        if filename:
            pixmap = QtGui.QPixmap(filename)
            if not pixmap.isNull():
                self.view.add_pixmap(pixmap)


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

Если вытолько хотите загрузить то же изображение, затем замените on_clicked на следующее:

Обновление:

@QtCore.pyqtSlot()
def on_clicked(self):
    filename = "path/of/image"
    pixmap = QtGui.QPixmap(filename)
    if not pixmap.isNull():
        self.view.add_pixmap(pixmap)
...