2013-09-28 212 views
10

Tôi muốn làm cho người dùng cá thể của mình QRubberband có thể định lại được. Tôi đã nhìn thấy câu hỏi này here nhưng không có giải pháp.Thực hiện xử lý thay đổi kích cỡ trên QRubberband? QSizeGrip có liên quan không?

Trường hợp sử dụng là người dùng có thể kéo ra vùng lựa chọn trên ảnh và sau đó thực hiện điều chỉnh bằng cách kéo trên lề QRubberband để thay đổi hình học hoặc định vị lại hình học hiện có bằng cách kéo vùng chọn. Tôi đã thực hiện tái định vị nhưng tôi tự hỏi về việc thay đổi kích thước xử lý để thay đổi hình học của QRubberband.

Có thể sử dụng QSizeGrip tại đây không? Nói cách đó, có cách nào tiêu chuẩn để kiểm tra các sự kiện loại chuột trong phạm vi bên trong Qt hoặc một số cách khác để thực hiện điều này không? Đây là cho một ứng dụng nghiên cứu mà không cần hoặc đảm bảo rất nhiều nỗ lực về tính năng này, nhưng nó sẽ là tốt để có.

Trả lời

25

Có, có thể. Đây là việc thực hiện:

Tiêu đề:

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

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

}; 

Nguồn:

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

Cách sử dụng: (ui->label là nhãn sử dụng để hiển thị hình ảnh được cắt)

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

screenshot

+0

Trông tốt. Tệ quá, tôi không có phiếu bầu cho ngày hôm nay. – lpapp

+0

Cảm ơn bạn đã nhập. Có vẻ đầy hứa hẹn nhưng tôi vẫn chưa làm việc. Trong một dự án thử nghiệm ứng dụng Qt mới chỉ với một nhãn hiệu QLabel, tôi nhận được băng cao su hiển thị nhưng đó là nó. Có một số phương pháp ngụ ý tôi cần phải thực hiện không? Tôi đã bật mouseTracking cho QLabel. –

+0

Nó hoạt động tốt với tôi trong một dự án sạch mới với Qt5. Hoàn thành các nguồn dự án: https://gist.github.com/Riateche/6743108 Ảnh chụp màn hình: http://i.imgur.com/D212BtQ.png –

3

Trong trường hợp bất kỳ ai khác lang thang ở đây với Google với ý định sử dụng với PyQt, đây là mã Python tương đương với ví dụ C++ của @ pavel-strakhov và tôi có thể xác nhận rằng nó hoạt động với tôi trên * buntu Linux 14.04 LTS với hệ thống - Cung cấp Python 3.4 và PyQt 5.2.1.

(Với sự báo trước rằng chủ đề phụ tùng của tôi lựa chọn không biết làm thế nào để xoay QSizeGrip ở góc trên cùng bên trái, vì vậy cả hai góc có kẹp giống hệt mắt.)

Nguồn:

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

Cách sử dụng:

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

Tôi xin lỗi với bất cứ ai nghĩ rằng điều này không đủ liên quan đến downvote, nhưng nó chỉ là kết quả duy nhất của Google để đạt được mục tiêu này trong PyQt, vì vậy tôi nghĩ rủi ro giảm giá là có thể giúp người dùng PyQt khác những người đi lang thang. – ssokolow

+0

Tôi lang thang trong và nó rất hữu ích, cảm ơn! – uMinded