AttributeError: 'Ui_MainWindow' object has no attribute 'rubber_band' 该如何解决
时间: 2023-06-22 10:24:16 浏览: 194
这个错误提示是因为您的 `Ui_MainWindow` 类中没有定义 `rubber_band` 属性,而您在 `GraphicsView` 类中尝试访问了该属性。
为了解决这个问题,您需要在 `GraphicsView` 类中定义 `rubber_band` 属性,并将其初始化为 `None`。然后在 `mousePressEvent` 中检查 `rubber_band` 是否为 `None`,如果是,则创建一个新的 `QRubberBand` 对象;否则,更新 `rubber_band` 对象的位置和大小即可。
下面是修正后的代码示例:
```python
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class GraphicsView(QGraphicsView):
def __init__(self):
super().__init__()
self.setScene(QGraphicsScene(self))
self.setDragMode(QGraphicsView.ScrollHandDrag)
self.rubber_band = None
self.origin = QPoint()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
if self.rubber_band is None:
self.rubber_band = QRubberBand(QRubberBand.Rectangle, self)
self.origin = event.pos()
self.rubber_band.setGeometry(QRect(self.origin, QSize()))
self.rubber_band.show()
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if self.rubber_band is not None and self.rubber_band.isVisible():
self.rubber_band.setGeometry(QRect(self.origin, event.pos()).normalized())
super().mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
if self.rubber_band is not None:
self.rubber_band.hide()
rect = self.mapToScene(self.rubber_band.geometry()).boundingRect()
rect = QRectF(rect.x(), rect.y(), rect.width(), rect.height())
print("Selected rect: ", rect)
super().mouseReleaseEvent(event)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.graphicsView = GraphicsView(self.centralwidget)
self.graphicsView.setObjectName("graphicsView")
self.verticalLayout.addWidget(self.graphicsView)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setGeometry(QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.load_image('test.png')
def load_image(self, file_path):
pixmap = QPixmap(file_path)
self.ui.graphicsView.scene().addPixmap(pixmap)
self.ui.graphicsView.fitInView(pixmap.rect(), Qt.KeepAspectRatio)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在上面的代码中,我们在 `GraphicsView` 类中定义了 `rubber_band` 属性,并将其初始化为 `None`。在 `mousePressEvent` 中,我们检查 `rubber_band` 是否为 `None`,如果是,则创建一个新的 `QRubberBand` 对象;否则,更新 `rubber_band` 对象的位置和大小。在 `mouseMoveEvent` 中,我们只更新 `rubber_band` 对象的位置和大小,如果 `rubber_band` 为 `None` 或者不可见,则不做任何处理。在 `mouseReleaseEvent` 中,我们检查 `rubber_band` 是否为 `None`,如果不是,则隐藏并删除 `rubber_band` 对象,并将其位置和大小映射到场景坐标系中。
阅读全文