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

标签 python qt widget pyqt pyqt4

我正在开发一个自定义小部件(继承自 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/

相关文章:

css - 删除或禁用其中一个 wordpress 小部件类

python - "RuntimeError: implement_array_function method already has a docstring"导入聊天机器人库时

python - 密文 Letter Freq Substitution : Comparing 2 dictionaries' dict keys by value and altering a text

c++ - 在 PySide (Qt) 中打开另一个程序并在原始窗口中显示

button - Spotify 播放按钮 - Spotilocal.com 错误 - ERR_CONNECTION_REFUSED

javascript - Ext4.2.1 如何从另一个浏览器选项卡打开一个带有小部件的新浏览器选项卡

python - 嵌入式 python : multiprocessing not working

python - 提高 python 脚本的速度

c++ - QGridLayout 中一致的行大小

c++ - Qt 5 QWebEngine页面printToPdf C2668对重载函数的不明确调用