AttributeError: у объекта «Настройки» нет атрибута «сцена» - PullRequest
0 голосов
/ 27 ноября 2018

Мне нужно добавить растровое изображение к моим прямоугольникам.Когда я нажимаю кнопку щелчка, тогда мое растровое изображение будет добавляться по одному в мои прямоугольники, но я получаю это attribute error.Кто-нибудь может подсказать мне, как решить эту ошибку?Я пробовал так много способов, но я не получил правильный вывод.

Заранее спасибо.

Ниже приведен мой код:

from pyface.qt import QtGui, QtCore
import sys
global X,Y

class ScanView(QtGui.QGraphicsView):
    def __init__(self,X=5, Y=5, parent=None):
        super(ScanView, self).__init__(parent)

        self.row = X
        self.cols = Y
        self.squareLB = 50
        self.width = Y*self.squareLB+2*self.squareLB
        self.height = X*self.squareLB+2*self.squareLB
        self.List = []
        if self.width>708:
            self.scene = QtGui.QGraphicsScene(0,0,self.width,self.height)
            for i in range(self.row):
                for j in range(self.cols):
                    item = self.scene.addRect(QtCore.QRectF(0,0,self.squareLB,self.squareLB))
                    item.setPos(self.squareLB+j*self.squareLB, X*self.squareLB-(i*self.squareLB))
                    self.List.append(item)
        else:
            self.scene = QtGui.QGraphicsScene(0,0,708,self.height)
            self.marginLR = (708.0-Y*self.squareLB)/2.0
            for i in range(self.row):
                for j in range(self.cols):
                    item = self.scene.addRect(QtCore.QRectF(0,0,self.squareLB,self.squareLB))
                    item.setPos(self.marginLR+j*self.squareLB, X*self.squareLB-(i*self.squareLB))
                    self.List.append(item)

        self.setScene(self.scene)

class Settings(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Settings, self).__init__(parent)
        spacer = QtGui.QWidget(self)
        spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
        self.vbox = QtGui.QVBoxLayout()
        self.save = QtGui.QPushButton("save")
        self.open= QtGui.QPushButton("open")
        self.folder= QtGui.QPushButton("Folder")
        self.folder.clicked.connect(self.showSettings)
        self.vbox.addWidget(self.save)
        self.vbox.addWidget(self.open)
        self.vbox.addWidget(self.folder)
        self.grid = QtGui.QGridLayout()
        self.grid.addLayout(self.vbox,0,0)
        self.scrollArea = QtGui.QScrollArea()
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Light)
        self.scrollArea.setWidgetResizable(True)
        self.grid.addWidget(self.scrollArea,0,1)
        self.setCentralWidget(QtGui.QWidget(self))
        self.centralWidget().setLayout(self.grid)
        self.setGeometry(200,100,300,300)
        self.show()
    def showSettings(self):
        self.MyView = ScanView(5,5)
        self.vbox2 = QtGui.QVBoxLayout()
        self.Scanbtn1 = QtGui.QPushButton(("click"))
        self.Scanbtn1.clicked.connect(self.on_clicked)
        self.vbox2.addWidget(self.Scanbtn1)

        self.newwidget = QtGui.QWidget()
        self.glayout = QtGui.QGridLayout(self.newwidget)
        self.glayout.addWidget(self.MyView,0,0)
        self.Sw = QtGui.QWidget()
        self.Sw.setLayout(self.vbox2)
        # self.Sw.setFixedWidth(width - self.scrollArea.viewport().width())
        self.glayout.addWidget(self.Sw,0,1)

        self.scrollArea.setWidget(self.newwidget)

    def on_clicked(self):
        print "hellloooooo"
        filename1 = "./img/tick.png"
        pixmap = QtGui.QPixmap(filename1)
        if not pixmap.isNull():
            self.MyView.add_pixmap(pixmap)
        # pic = QtGui.QPixmap("./img/tick.png")
        # scene.addItem(QtGui.QGraphicsPixmapItem(pic))
        # # view = self.gv
        # self.MyView.setScene(scene)
        # self.MyView.setRenderHint(QtGui.QPainter.Antialiasing)
        # self.MyView.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Settings()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 27 ноября 2018

У вас есть эта ошибка, потому что сцена не существует в классе Настройки, self.scene является членом класса ScanView, плюс self.scene отличается от сцены.

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

import sys
from pyface.qt import QtGui, QtCore

class ScanView(QtGui.QGraphicsView):
    def __init__(self,X=5, Y=5, parent=None):
        super(ScanView, self).__init__(parent)
        self._squares = []
        n_rows, n_cols = X, Y
        squareLB = 50
        width, height = (Y + 2)*squareLB, (X + 2)*squareLB
        self._scene = QtGui.QGraphicsScene(0, 0, max(708, width), height)
        p = squareLB if width > 708 else (708.0-Y*squareLB)/2.0

        for i in range(n_rows):
            for j in range(n_cols):
                it = self._scene.addRect(0, 0, squareLB, squareLB)
                it.setPos(p + j*squareLB, i*squareLB)   
                self._squares.append(it)
        self.setScene(self._scene)

class Settings(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Settings, self).__init__(parent)
        self.save = QtGui.QPushButton("save")
        self.open = QtGui.QPushButton("open")
        self.folder = QtGui.QPushButton("Folder", clicked=self.showSettings)
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.save)
        vbox.addWidget(self.open)
        vbox.addWidget(self.folder)
        self.scrollArea = QtGui.QScrollArea(widgetResizable=True)
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Light)
        hlay = QtGui.QHBoxLayout(central_widget)
        hlay.addLayout(vbox)
        hlay.addWidget(self.scrollArea)
        self.setGeometry(200, 100, 300, 300)

    def showSettings(self):
        self.view = ScanView(5, 5)
        self.scanbtn = QtGui.QPushButton("click", clicked=self.on_clicked)
        self.newwidget = QtGui.QWidget()
        hlay = QtGui.QHBoxLayout(self.newwidget)
        hlay.addWidget(self.view)
        hlay.addWidget(self.scanbtn)
        self.scrollArea.setWidget(self.newwidget)

        self._iter_squares = iter(self.view._squares)

    def on_clicked(self):
        filename = "./img/tick.png"
        pixmap = QtGui.QPixmap(filename)
        if pixmap.isNull():
            return
        try:
            it = next(self._iter_squares)
        except StopIteration:
            pass
        else:
            pixmap = pixmap.scaled(it.rect().size().toSize())
            pixmap_it = QtGui.QGraphicsPixmapItem(pixmap, it)

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Settings()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
...