我正在开发一个自定义小部件(继承自 QWidget)以用作控件。如何将小部件的纵横比固定为正方形,但在垂直和水平空间都允许的情况下仍允许布局管理器调整其大小?
我知道我可以设置 QPainter 的视口(viewport),使其仅在中央方形区域中绘制,但仍允许用户单击绘制区域的任一侧。
最佳答案
似乎没有通用的方法可以在所有情况下使小部件保持正方形。 您必须选择一个:
- 让它的高度取决于它的宽度:
class MyWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
policy.setHeightForWidth(True)
self.setSizePolicy(policy)
...
def heightForWidth(self, width):
return width
...
- 让它的最小宽度取决于它的高度:
class MyWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
...
def resizeEvent(self, e):
setMinimumWidth(height())
...
只要有这种可能性,这样的小部件就会保持正方形。
对于其他情况,您确实应该考虑更改视口(viewport),正如您提到的那样。鼠标事件应该不是什么大问题,只需找到小部件的中心(将尺寸除以 2),找到 min(width, height)
并从那里开始。您应该能够通过坐标验证鼠标事件。很高兴调用QMouseEvent.accept
,仅当事件通过验证并且您使用了该事件时。
关于python - PyQT 自定义小部件固定为正方形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11008140/