PyQT自定义小部件固定为正方形

tho*_*ate 4 python qt pyqt widget pyqt4

我正在开发自定义窗口小部件(从QWidget继承)以用作控件。如何在垂直和水平空间都允许的情况下将小部件的长宽比固定为正方形,但仍允许布局管理器调整其长宽比?

我知道我可以设置QPainter的视口,使其仅在中央正方形区域中绘制,但是仍然允许用户单击绘制区域的任一侧。

Ole*_*pin 5

在所有情况下,似乎都没有通用的方法可以使小部件保持方形。您必须选择一个:

  • 使其高度取决于其宽度:
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
    ...
Run Code Online (Sandbox Code Playgroud)
  • 使其最小宽度取决于其高度:
class MyWidget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
    ...
    def resizeEvent(self, e):
        setMinimumWidth(height())
    ...
Run Code Online (Sandbox Code Playgroud)

只要有这种可能性,此类小部件将保持正方形。

如前所述,在其他情况下,您确实应该考虑更改视口。鼠标事件应该没什么大问题,只需找到小部件的中心(将尺寸除以2),min(width, height)然后从那里找到并移动即可。您应该能够通过坐标验证鼠标事件。QMouseEvent.accept仅当事件通过了验证并且您使用了事件时,才可以调用。