QGraphicsView
是用于显示场景的小部件(
QGraphicsScene
),所以常见的做法是在场景中添加一个矩形(就像演员一样),而不是绘制。你也在
Myrect
这是其他小部件所在的小部件,因此它位于背景中,其他小部件将覆盖您所做的绘制。
另一方面,不建议修改Qt设计器生成的类,因此我冒昧地将其返回到初始状态
返回起点,将矩形添加到
Qgraphicscene
您必须知道场景坐标系中这些点的坐标,因此一种方法是使用
eventFilter()
,这必须过滤
GraphicsSceneMousePress
和
GraphicsSceneMouseRelease
事件,这些事件具有位置,我们可以使用
scenePos()
方法
...
class Myrect(QtGui.QMainWindow,Ui_zoom_win_qt):
def __init__(self, *args, **kwargs):
QtGui.QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
self.pushButton.clicked.connect(test_clipped_zoom)
self.scene = QtGui.QGraphicsScene()
pixmap = QtGui.QPixmap('Koala.jpg').scaledToHeight(420)
self.scene.addPixmap(pixmap)
self.graphicsView.setScene(self.scene)
self.scene.installEventFilter(self)
self.start = QtCore.QPointF()
def eventFilter(self, obj, event):
if obj == self.scene:
if event.type() == QtCore.QEvent.GraphicsSceneMousePress:
self.start = event.scenePos()
elif event.type() == QtCore.QEvent.GraphicsSceneMouseRelease:
end = event.scenePos()
self.scene.addRect(QtCore.QRectF(self.start, end))
self.start = QtCore.QPointF()
return QtGui.QMainWindow.eventFilter(self, obj, event)
def test_clipped_zoom():
zoom_win_qt.hide()
w.show()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
w = Myrect()
w.show()
sys.exit(app.exec_())
完整代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'zoom_win_qt.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_zoom_win_qt(object):
def setupUi(self, zoom_win_qt):
zoom_win_qt.setObjectName(_fromUtf8("zoom_win_qt"))
zoom_win_qt.resize(800, 600)
self.centralwidget = QtGui.QWidget(zoom_win_qt)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.graphicsView = QtGui.QGraphicsView(self.centralwidget)
self.graphicsView.setGeometry(QtCore.QRect(80, 40, 611, 431))
self.graphicsView.setObjectName(_fromUtf8("graphicsView"))
self.horizontalSlider = QtGui.QSlider(self.centralwidget)
self.horizontalSlider.setGeometry(QtCore.QRect(80, 500, 160, 19))
self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider.setObjectName(_fromUtf8("horizontalSlider"))
self.progressBar = QtGui.QProgressBar(self.centralwidget)
self.progressBar.setGeometry(QtCore.QRect(590, 490, 118, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName(_fromUtf8("progressBar"))
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(380, 500, 75, 23))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
zoom_win_qt.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(zoom_win_qt)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
zoom_win_qt.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(zoom_win_qt)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
zoom_win_qt.setStatusBar(self.statusbar)
self.retranslateUi(zoom_win_qt)
QtCore.QMetaObject.connectSlotsByName(zoom_win_qt)
def retranslateUi(self, zoom_win_qt):
zoom_win_qt.setWindowTitle(_translate("zoom_win_qt", "MainWindow", None))
self.pushButton.setText(_translate("zoom_win_qt", "PushButton", None))
class Myrect(QtGui.QMainWindow,Ui_zoom_win_qt):
def __init__(self, *args, **kwargs):
QtGui.QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
self.pushButton.clicked.connect(test_clipped_zoom)
self.scene = QtGui.QGraphicsScene()
pixmap = QtGui.QPixmap('Koala.jpg').scaledToHeight(420)
self.scene.addPixmap(pixmap)
self.graphicsView.setScene(self.scene)
self.scene.installEventFilter(self)
self.start = QtCore.QPointF()
def eventFilter(self, obj, event):
if obj == self.scene:
if event.type() == QtCore.QEvent.GraphicsSceneMousePress:
self.start = event.scenePos()
elif event.type() == QtCore.QEvent.GraphicsSceneMouseRelease:
end = event.scenePos()
self.scene.addRect(QtCore.QRectF(self.start, end))
self.start = QtCore.QPointF()
return QtGui.QMainWindow.eventFilter(self, obj, event)
def test_clipped_zoom():
zoom_win_qt.hide()
w.show()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
w = Myrect()
w.show()
sys.exit(app.exec_())