【问题标题】:AttributeError: 'Settings' object has no attribute 'scene'AttributeError:“设置”对象没有属性“场景”
【发布时间】:2018-11-27 07:16:12
【问题描述】:

我需要将像素图添加到我的矩形。当我按下点击按钮时,我的像素图将被一一添加到我的矩形中,但我得到了这个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()

【问题讨论】:

  • 如果您要求调试,请始终发布您的完整堆栈跟踪
  • 我没有得到指出的错误
  • 请提供错误日志
  • 先生,当您单击按钮时会出现错误
  • @navyasri 您想将 QPixmap 添加到哪个方格?

标签: python pyqt pyqt4 qgraphicsscene


【解决方案1】:

你有这个错误,因为场景在设置类中不存在,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()

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 2013-05-03
    • 2012-10-02
    • 2020-11-06
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多