PyQt5 QGraphicsView объект не имеет атрибута resetMatrix? - PullRequest
0 голосов
/ 22 января 2019

Рассмотрим этот пример PyQT5, назовем его test.py (для меня поведение одинаково при обоих python2 и python3 в Ubuntu 18.04):

#!/usr/bin/env python
from __future__ import print_function

import sys, os
from PyQt5 import QtCore, QtWidgets, QtGui

class PhotoViewer(QtWidgets.QGraphicsView):
    def __init__(self, parent):
        super(PhotoViewer, self).__init__(parent)
        self.parent = parent
        #self.resetMatrix() # SO: 39101834, but "AttributeError: 'PhotoViewer' object has no attribute 'resetMatrix'"
        self.scale(1.0, 1.0)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setWindowTitle("test.py")
        self.setMinimumWidth(1000)
        self.setMinimumHeight(600)
        self.viewer = PhotoViewer(self)
        wid = QtWidgets.QWidget(self)
        self.setCentralWidget(wid)
        VBlayout = QtWidgets.QVBoxLayout()
        VBlayout.addWidget(self.viewer)
        wid.setLayout(VBlayout)

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

Если я запускаю его как есть, он работает нормально, без проблем.

Если я раскомментирую закомментированную строку self.resetMatrix(), программа завершится с ошибкой:

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 29, in <module>
    main = MainWindow()
  File "test.py", line 20, in __init__
    self.viewer = PhotoViewer(self)
  File "test.py", line 11, in __init__
    self.resetMatrix() # SO: 39101834, but "AttributeError: 'PhotoViewer' object has no attribute 'resetMatrix'"
AttributeError: 'PhotoViewer' object has no attribute 'resetMatrix'

Но я нахожу это довольно странным, потому что PhotoViewer наследуется от QGraphicsView, вызов PhotoViewer.scale(), который является QGraphicsView методом, явно не проблема - и Как сбросить масштаб в QGraphicsView? документы, которые могут быть вызваны QGraphicsView()->resetMatrix(), а также документировано для:

Какую ошибку я совершаю - почему я не могу позвонить resetMatrix в этом случае; и что я должен сделать, чтобы иметь возможность вызывать эту функцию?

1 Ответ

0 голосов
/ 22 января 2019

Кажется, это ошибка PyQt5, я протестировал ее с PySide2, и она работает правильно. Но есть обходной путь: если вы проверите исходный код , вы увидите, что метод resetMatrix () вызывает только resetTransform () , поэтому он использует этот метод.

class PhotoViewer(QtWidgets.QGraphicsView):
    def __init__(self, parent):
        super(PhotoViewer, self).__init__(parent)
        self.parent = parent
        self.resetTransform() # self.resetMatrix()
        self.scale(1.0, 1.0)
...