2013-09-28 18 views
10

QRubberband örnek kullanıcımı yeniden boyutlandırılabilir yapmak istiyorum. Bu soruyu here gördüm ama bir çözüm yok.QRubberband'da yeniden boyutlandırma tutamaçları uygulama? QSizeGrip alakalı mı?

kullanma durumu kullanıcı bir fotoğrafın üzerine bir seçim çerçevesi dışarı sürükleyin ve ardından geometriyi değiştirmek veya seçimi sürükleyerek mevcut geometriyi yeniden konumlandırmak için QRubberband marjları üzerinde sürükleyerek ince ayarlamalar yapabilirsiniz olmasıdır. Yeniden konumlandırmayı gerçekleştirdim ancak QRubberband'ın geometrisini değiştirmek için yeniden boyutlandırma tutamaçlarını merak ediyorum.

mümkün burada QSizeGrip kullanımı var mı? Bunu kısıtlamak, Qt içinde fare içinde marj türü olayları kontrol etmek için standart bir yolu var mı yoksa bunu uygulamak için başka bir yolu var mı? Bu, bu özellik üzerinde çok fazla çaba gerektirmeyen veya gerektirmeyen bir araştırma uygulaması içindir, ancak sahip olmak iyi olacaktır.

cevap

25

Evet, bu mümkün.

Başlık: İşte uygulamasıdır

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

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

}; 

Kaynak:

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

Kullanımı:

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

(ui->label görüntüyü görüntülemek için kullanılan etiket kırpılmış edilecek) screenshot

+0

iyi görünüyor. Çok kötü, bugün için oy kullanmam yok. – lpapp

+0

Giriş için teşekkürler. Umut verici görünüyor ama henüz çalışmadım. Sadece QLabel ile yapılan yeni bir test Qt Uygulaması projesinde, lastik bandının gösterilmesini sağlıyorum ama bu kadar. Uygulamam gereken bazı ima edilmiş yöntemler var mı? QLabel için mouseTracking etkinliğim var. –

+0

Qt5 ile yeni ve temiz bir projede bana iyi çalışıyor. Komple proje kaynaklar: https://gist.github.com/Riateche/6743108 Ekran: http://i.imgur.com/D212BtQ.png sorun ayırdığınız için –

3

Burada PyQt ile kullanmak niyetiyle başkaları burada Google dışında geziniyorsa, burada @ pavel-strakhov'un C++ örneğine eşdeğer Python kodu var ve bunun benim için çalıştığını onaylayabilirim * buntu Linux 14.04 LTS sistemle -provided Python 3.4 ve PyQt 5.2.1.

(Seçtiğim Widget tema böylece hem köşeler özdeş görünümlü tutma yerine sahip, sol üst köşede QSizeGrip döndürmek için nasıl bilmiyor ihtar ile.)

Kaynak:

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

Kullanımı:

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

Bunun, reddetmek için yeterince alakasız olduğunu düşünen herkesten özür dilerim, ancak PyQt'de bu hedefe ulaşmak için önemli bir yer bulduğum * yalnızca Google sonucu oldu, bu yüzden diğer PyQt kullanıcılarına yardımcı olmak için risk düşürme riskinin değdiğini düşündüm kim dolaşıyor. – ssokolow

+0

Ben gezindi ve çok yardımcı oldu, teşekkürler! – uMinded