Внедрение ручек изменения размера на QRubberband? Соответствует ли QSizeGrip?

Я хочу, чтобы мой пользовательский экземпляр QRubberband изменялся по размеру. Я видел этот вопрос здесь, но решения нет.

Вариант использования заключается в том, что пользователь может вытащить выделение по фотографии, а затем выполнить точную настройку, перетащив поля QRubberband, чтобы изменить геометрию, или переместите существующую геометрию, перетащив выделение. У меня есть переопределение, но мне интересно, как изменить размер ручек для изменения геометрии QRubberband.

Можно ли здесь использовать QSizeGrip? Если это не так, существует ли стандартный способ проверки событий типа "мышь в пределах поля" внутри Qt или каким-либо другим способом реализовать это? Это для исследовательского приложения, которое не требует или не требует больших усилий для этой функции, но было бы неплохо иметь.

Ответ 1

Да, это возможно. Вот реализация:

Заголовок:

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);

screenshot

Ответ 2

Если кто-то еще бродит здесь с Google с намерением использовать это с PyQt, вот эквивалентный код Python для примера @pavel-strakhov С++, и я могу подтвердить, что он работает для меня на * 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)