Реализация ручек изменения размера на QRubberband? Актуален ли QSizeGrip?

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

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

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

10

Решение

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

Заголовок:

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

Скриншот

25

Другие решения

На случай, если кто-нибудь еще зайдет сюда от Google с намерением использовать это с PyQt, вот эквивалентный код Python для примера C ++ @ 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)
4

По вопросам рекламы [email protected]