我写了这段代码,但它不能正常工作(在我看来)。
如果您知道如何使其正常工作,请提供帮助。
拉伸就像Qt Dsigner的,但我不明白它是怎么发生的。
它应该像这样工作:
from PyQt5 import QtCore, QtGui, QtWidgets
class SizeGrip(QtWidgets.QSizeGrip):
def __init__(self, location_angle, parent):
super().__init__(parent)
parent.installEventFilter(self)
self.setFixedSize(30, 30)
self.location_angle = location_angle
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.Resize:
if self.location_angle == 'left_top':
geo = QtCore.QRect(0, 0, 30, 30)
self.setGeometry(geo)
elif self.location_angle == 'center_top':
_geo = self.rect()
_geo.moveBottomRight(source.rect().bottomRight())
x = _geo.x() // 2
geo = QtCore.QRect(x, 0, 30, 30)
self.setGeometry(geo)
elif self.location_angle == 'right_top':
_geo = self.rect()
_geo.moveBottomRight(source.rect().bottomRight())
x = _geo.x()
geo = QtCore.QRect(x, 0, 30, 30)
self.setGeometry(geo)
elif self.location_angle == 'left_bottom':
_geo = self.rect()
_geo.moveBottomRight(source.rect().bottomRight())
y = _geo.y()
geo = QtCore.QRect(0, y, 30, 30)
self.setGeometry(geo)
elif self.location_angle == 'right_bottom':
geo = self.rect()
geo.moveBottomRight(source.rect().bottomRight())
self.setGeometry(geo)
return super().eventFilter(source, event)
def paintEvent(self, event):
qp = QtGui.QPainter(self)
qp.setPen(QtCore.Qt.white)
qp.setBrush(QtCore.Qt.red)
qp.drawRect(QtCore.QRect(10, 10, 10, 10))
class Container(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.sizeGrip1 = SizeGrip('left_top', self)
self.sizeGrip1_1 = SizeGrip('center_top', self)
self.sizeGrip2 = SizeGrip('right_top', self)
self.sizeGrip3 = SizeGrip('left_bottom', self)
self.sizeGrip4 = SizeGrip('right_bottom', self)
self.startPos = None
layout = QtWidgets.QVBoxLayout(self)
layout.setContentsMargins(20, 20, 20, 20)
self.setStyleSheet('''
Container {
background: lightblue;
border: 0px;
border-radius: 4px;
}
''')
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.startPos = event.pos()
def mouseMoveEvent(self, event):
if self.startPos:
self.move(self.pos() + (event.pos() - self.startPos))
def mouseReleaseEvent(self, event):
self.startPos = None
class GraphicsRoundedFrame(QtWidgets.QGraphicsProxyWidget):
def __init__(self):
super().__init__()
self.container = Container()
self.setWidget(self.container)
def addWidget(self, widget):
self.container.layout().addWidget(widget)
def paint(self, qp, opt, widget):
qp.save()
p = QtGui.QPainterPath()
p.addRoundedRect(self.boundingRect().adjusted(0, 0, -.5, -.5), 4, 4)
qp.setClipPath(p)
super().paint(qp, opt, widget)
qp.restore()
class View(QtWidgets.QGraphicsView):
def __init__(self):
super().__init__()
scene = QtWidgets.QGraphicsScene()
self.setScene(scene)
self.setRenderHints(QtGui.QPainter.Antialiasing)
scene.setSceneRect(0, 0, 1024, 768)
texture = QtGui.QImage(30, 30, QtGui.QImage.Format_ARGB32)
qp = QtGui.QPainter(texture)
qp.setBrush(QtCore.Qt.white)
qp.setPen(QtGui.QPen(QtGui.QColor(189, 190, 191), 2))
qp.drawRect(texture.rect())
qp.end()
scene.setBackgroundBrush(QtGui.QBrush(texture))
testFrame = GraphicsRoundedFrame()
scene.addItem(testFrame)
testFrame.container.layout().addStretch(1)
testFrame.addWidget(QtWidgets.QPushButton('I am a button'))
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = View()
w.show()
sys.exit(app.exec_())

试试这样: