强制QRubberBand具有特定的宽高比

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强制QRubberBand具有特定的宽高比相关的知识,希望对你有一定的参考价值。

我有一个可调整大小的橡皮筋带拖动手柄,很有趣。我想强制它到4x3选择矩形。它有效,但有裁剪文物,并且握把不会停留在角落里。

码:

class Resizable_rubber_band(QWidget):
    def __init__(self, parent=None):
        super(Resizable_rubber_band, self).__init__(parent)
        self.setWindowFlags(Qt.SubWindow)
        self.layout = QHBoxLayout(self)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.grip1 = QSizeGrip(self)
        self.grip2 = QSizeGrip(self)
        self.layout.addWidget(self.grip1, 0, Qt.AlignLeft | Qt.AlignTop)
        self.layout.addWidget(self.grip2, 0, Qt.AlignRight | Qt.AlignBottom)
        self.rubberband = QRubberBand(QRubberBand.Rectangle, self)
        self.rubberband.move(0, 0)
        self.rubberband.show()
        self.show()

    def resizeEvent(self, event):
        force 4h x 3w aspect ratio using QSize
        if width < height: height = 1.333 * width
        if width > height: width = height / 1.333
        width = self.width()
        height = self.height()
        if(width < height):
            height = int(width * 1.333)
        else:
            width = int(height / 1.333)
        self.rubberband.resize(QSize(width, height))
答案

您需要缩放橡皮筋及其容器并调整其大小。

这是一个基于您的示例的演示:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class ResizableRubberBand(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ResizableRubberBand, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.SubWindow)
        layout = QtWidgets.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(
            QtWidgets.QSizeGrip(self), 0,
            QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
        layout.addWidget(
            QtWidgets.QSizeGrip(self), 0,
            QtCore.Qt.AlignRight | QtCore.Qt.AlignBottom)
        self._band = QtWidgets.QRubberBand(
            QtWidgets.QRubberBand.Rectangle, self)
        self._band.show()
        self.show()

    def resizeEvent(self, event):
        size = QtCore.QSize(3, 4)
        size.scale(self.size(), QtCore.Qt.KeepAspectRatio)
        self.resize(size)
        self._band.resize(self.size())

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtWidgets.QPushButton('Show Rubber Band')
        self.button.clicked.connect(self.handleButton)
        self.label = QtWidgets.QLabel()
        self.label.setScaledContents(True)
        self.label.setPixmap(QtGui.QPixmap('image.jpg'))
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.button)

    def handleButton(self):
        self.band = ResizableRubberBand(self.label)
        self.band.setGeometry(50, 50, 150, 300)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(800, 100, 600, 500)
    window.show()
    sys.exit(app.exec_())

以上是关于强制QRubberBand具有特定的宽高比的主要内容,如果未能解决你的问题,请参考以下文章

在自定义UITableViewCell中保持UIImageView的宽高比

ImageMagick:如何将图像最小化为特定宽高比?

canvas画板强制横屏画不了

如何找到适合预定尺寸的宽高比 4:3 的尺寸?

markdown 使用约束布局的StaggeredLayoutManager中的宽高比

所有 Android 手机和平板电脑设备的宽高比是多少?