13

我想让我的QRubberband实例用户可调整大小。我在这里看到了这个问题,但没有解决方案。

用例是用户可以在照片上拖出选择框,然后通过拖动QRubberband边距来更改几何图形,或通过拖动选择重新定位现有几何图形来进行微调。我已经实现了重新定位,但我想知道调整手柄大小以更改 QRubberband 的几何形状。

可以在这里使用 QSizeGrip 吗?除此之外,是否有一种标准方法来检查鼠标在边距内的类型事件Qt或其他方式来实现这一点?这适用于不需要或保证在此功能上付出大量努力的研究应用程序,但拥有它会很好。

4

2 回答 2

32

是的,这是可能的。这是实现:

标题:

class Resizable_rubber_band : public QWidget {
public:
  Resizable_rubber_band(QWidget* parent = 0);

private:
  QRubberBand* rubberband;
  void resizeEvent(QResizeEvent *);

};

来源:

Resizable_rubber_band::Resizable_rubber_band(QWidget *parent) : QWidget(parent) {
  //tell QSizeGrip to resize this widget instead of top-level window
  setWindowFlags(Qt::SubWindow);
  QHBoxLayout* layout = new QHBoxLayout(this);
  layout->setContentsMargins(0, 0, 0, 0);
  QSizeGrip* grip1 = new QSizeGrip(this);
  QSizeGrip* grip2 = new QSizeGrip(this);
  layout->addWidget(grip1, 0, Qt::AlignLeft | Qt::AlignTop);
  layout->addWidget(grip2, 0, Qt::AlignRight | Qt::AlignBottom);
  rubberband = new QRubberBand(QRubberBand::Rectangle, this);
  rubberband->move(0, 0);
  rubberband->show();
  show();
}

void Resizable_rubber_band::resizeEvent(QResizeEvent *) {
  rubberband->resize(size());
}

用法:(ui->label是用于显示要裁剪的图像的标签)

Resizable_rubber_band* band = new Resizable_rubber_band(ui->label);
band->move(100, 100);
band->resize(50, 50);
band->setMinimumSize(30, 30);

截屏

于 2013-09-28T12:48:06.720 回答
12

万一其他人在谷歌之外徘徊并打算将其与 PyQt 一起使用,这里是 @pavel-strakhov 的 C++ 示例的等效 Python 代码,我可以确认它在系统提供的 *buntu Linux 14.04 LTS 上适用于我Python 3.4 和 PyQt 5.2.1。

(需要注意的是,我选择的小部件主题不知道如何旋转QSizeGrip左上角的,所以两个角都有相同的手柄。)

来源:

class ResizableRubberBand(QWidget):
    """Wrapper to make QRubberBand mouse-resizable using QSizeGrip

    Source: http://stackoverflow.com/a/19067132/435253
    """
    def __init__(self, parent=None):
        super(ResizableRubberBand, 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):
        self.rubberband.resize(self.size())

用法:

self.band = ResizableRubberBand(ui.label)
self.band.move(100, 100)
self.band.resize(50, 50)
self.band.setMinimumSize(30, 30)
于 2017-04-14T20:12:16.623 回答