Как я могу удалить или обновить ячейку каждой сетки - PullRequest
0 голосов
/ 16 октября 2018

Теперь я хочу, чтобы, когда пользователь щелкает ячейку сетки, она становится редактируемой, и он может редактировать значения / изображения ячеек и соответственно обновлять данные.

Я не хочу использоватьвстроенные кнопки редактирования, удаления и обновления сетки.Как я могу это сделать? Пожалуйста, направьте меня. Спасибо заранее, учитывая ниже мой код:

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("checkmark.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)
    def mousePressEvent(self,evnt):
        # print event
        # print(dir(evnt))
        print evnt.screenPos().x()
        print evnt.screenPos().y()
        self.ix = int(evnt.screenPos().x()/Setting.WIDTH)
        self.ix = int(evnt.screenPos().y()/Setting.HEIGHT)
        print self.ix,self.iy




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_())

1 Ответ

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

Самый распространенный способ установки параметров - это использовать контекстное меню, в котором вы создаете меню, в которое вы добавляете QAction s, и в зависимости от выбора соответствующего QAction будет возвращаться, в зависимости от выбора.Вы должны изменить изображение или удалить его, как показано ниже (укажите, когда рисовать цифры, которые я использовал элементы):

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("checkmark.png").scaled(Setting.WIDTH, Setting.HEIGHT,
            QtCore.Qt.IgnoreAspectRatio,
            QtCore.Qt.SmoothTransformation)

        for i in range(X):
            p = QtCore.QPointF(Setting.WIDTH*i, 0)
            for j in range(Y):
                item = self.addPixmap(pixmap)
                item.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):
    def __init__(self, parent=None):
        super(QV, self).__init__(parent)
        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.on_customContextMenuRequested)

    def on_customContextMenuRequested(self, pos):
        items = self.items(pos)
        if items:
            menu = QtGui.QMenu()

            change_action = menu.addAction("Change image")
            delete_action = menu.addAction("Delete")

            action  = menu.exec(self.mapToGlobal(pos))

            if action is change_action:
                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():
                        pixmap = pixmap.scaled(Setting.WIDTH, Setting.HEIGHT,
                            QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation)
                        for item in items:
                            if isinstance(item, QtGui.QGraphicsPixmapItem):
                                item.setPixmap(pixmap)

            elif action is delete_action:
                for it in reversed(items):
                    self.scene().removeItem(it)
                    del it


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_())
...