AttributeError: у объекта 'NoneType' нет атрибута 'scenePos' - PullRequest
0 голосов
/ 26 ноября 2018

Вот мой пример кода, я хочу напечатать мои координаты x, y позиций, используя событие нажатия мыши, я получил эту ошибку, может кто-нибудь, пожалуйста, помогите мне, и я хочу отобразить мой графический вид в серединеthe scrollArea.

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

from pyface.qt import QtGui, QtCore
import sys

class MyView(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)
        self.row = 2
        self.cols = 4
        self.scene = QtGui.QGraphicsScene(0,0,500,500)
        self.List = []

        for i in range(self.row):
            for j in range(self.cols):
                item = self.scene.addRect(QtCore.QRectF(0,0,30,30))
                item.setPos(30+j*30,500-i*30-60)
                print item.scenePos()
                self.List.append(item)
        self.setScene(self.scene)
    def mousePressEvent(self,event):
        super(MyView,self).mousePressEvent(event)
        p = QtCore.QPointF(event.pos())
        print "positonnnnnnnnnnnnnnnn", p
        item = self.scene.itemAt(p)
        print "@@@@@@@@@@@@@@@@@@@@@@@@@2"
        print item.scenePos()
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.newwidget = QtGui.QWidget()
        self.glayout = QtGui.QGridLayout(self.newwidget)
        self.MyView =  MyView()
        self.glayout.addWidget(self.MyView,0,1)
        self.scrollArea.setWidget(self.newwidget)
def main():
    app = QtGui.QApplication(sys.argv)
    ex = Settings()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

1 Ответ

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

Координаты элементов отличаются от координат окна, в случае event.pos() возвращает положение мыши относительно viewport из QGraphicsView, поэтому вам придется преобразовать его вкоординаты сцены с mapToScene(), с другой стороны при использовании itemAt() может вернуть None, поскольку в определенных областях сцены нет элементов, поэтому желательно проверить

def mousePressEvent(self, event):
    super(MyView,self).mousePressEvent(event)
    p = self.mapToScene(event.pos())
    item = self.scene.itemAt(p)
    if item is not None:
        print(item.scenePos())

Чтобы понять различныеСистемы координат, которые обрабатывают QGraphicsView, QGraphicsScene и QGraphicsItems, я рекомендую прочитать Graphics View Framework .

...