Wdrażanie uchwytów zmiany rozmiaru na QRubberband? Czy QSizeGrip jest odpowiedni?

Chciałbym zrobić mójQRubberband zmiana rozmiaru instancji użytkownika. Widziałem to pytanietutaj ale nie ma rozwiązania.

Przypadek użycia polega na tym, że użytkownik może przeciągnąć markizę zaznaczenia na zdjęcie, a następnie dokonać dokładnych regulacji, przeciągającQRubberband marginesy, aby zmienić geometrię, lub zmienić położenie istniejącej geometrii, przeciągając zaznaczenie. Mam zaimplementowane repozycjonowanie, ale zastanawiam się nad zmianami uchwytów do zmiany geometrii QRubberband.

Czy można tutaj użyć QSizeGrip? Poza tym, czy istnieje standardowy sposób sprawdzania zdarzeń typu myszy wewnątrz marginesuQt lub jakiś inny sposób wdrożenia? To jest dla aplikacji badawczej, która nie wymaga ani nie wymaga wiele wysiłku w tej funkcji, ale dobrze byłoby mieć.

questionAnswers(2)

Tak, to możliwe. Oto implementacja:

Nagłówek:

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

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

};

Źródło:

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

Stosowanie: (ui->label to etykieta używana do wyświetlania obrazu do przycięcia)

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

W przypadku, gdyby ktoś inny wędrował tu z Google z zamiarem wykorzystania go z PyQt, oto odpowiednik kodu Pythona do przykładu C ++ @ pavel-strakhov i mogę potwierdzić, że działa on dla mnie na * buntu Linux 14.04 LTS z dostarczonym systemem Python 3.4 i PyQt 5.2.1.

(Z zastrzeżeniem, że mój wybrany motyw widgetu nie wie, jak obracaćQSizeGrip w lewym górnym rogu, więc oba narożniki mają identycznie wyglądające uchwyty.)

Źródło:

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

Stosowanie:

self.band = ResizableRubberBand(ui.label)
self.band.move(100, 100)
self.band.resize(50, 50)
self.band.setMinimumSize(30, 30)

yourAnswerToTheQuestion