2012-06-14 11 views
5

Tôi có một lớp trong Qt kế thừa QDockWidget. Và lớp đó chứa một tiện ích khác. Có khả năng nào để định nghĩa một hàm trong lớp thừa kế QDockWidget của tôi để vẽ thứ trên đầu widget bị chứa không? Giống như bức tranh để độc lập với tiện ích chứa nhưng được liên kết với lớp được thừa hưởng.Vẽ/Vẽ trên đầu các tiện ích được gắn trong QDodckWidget

Cảm ơn bạn

Trả lời

8

Chắc chắn điều đó là có thể. Nó là khá đơn giản để làm, trên thực tế. Bạn cần đặt tiện ích con nằm trên đầu mọi thứ khác trong số QDockWidget của mình. Để làm điều đó, nó phải là widget con cuối cùng bạn thêm vào dockwidget của bạn. Widget đó không được vẽ nền của nó, và sau đó nó có thể vẽ trên bất kỳ trẻ em nào của dockwidget. Kích thước của tiện ích phải theo dõi kích thước của tiện ích con.

Dưới đây là ví dụ có thể kết hợp được.

Screenshot of the example

// https://github.com/KubaO/stackoverflown/tree/master/questions/overlay-line-11034838 
#include <QtGui> 
#if QT_VERSION > QT_VERSION_CHECK(5,0,0) 
#include <QtWidgets> 
#endif 

class Line : public QWidget { 
    void paintEvent(QPaintEvent *) override { 
     QPainter p{this}; 
     p.setRenderHint(QPainter::Antialiasing); 
     p.drawLine(rect().topLeft(), rect().bottomRight()); 
    } 
public: 
    using QWidget::QWidget; 
}; 

class Window : public QWidget { 
    QHBoxLayout layout{this}; 
    QLabel left{"Left", this}; 
    QLabel right{"Right", this}; 
    Line line{this}; 

    void resizeEvent(QResizeEvent *) override { 
     line.setGeometry(rect()); 
    } 
public: 
    Window(QWidget * parent = nullptr) : QWidget{parent} { 
     left.setFrameStyle(QFrame::Box | QFrame::Raised); 
     layout.addWidget(&left); 
     right.setFrameStyle(QFrame::Box | QFrame::Raised); 
     layout.addWidget(&right); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication app{argc, argv}; 
    Window w; 
    w.show(); 
    return app.exec(); 
} 
0

AFAIK: Số

Widgets được rút ra trong trật tự chiều sâu, vì vậy bất cứ QDockWidget sơn lớp có nguồn gốc của mình, sẽ được rút ra hơn bởi các widget chứa khi chúng được cập nhật (ngay sau đó không có nghi ngờ , vì các bản cập nhật sơn được truyền cho các tiện ích con).

+0

Đó vẽ theo thứ tự độ sâu chính xác là những gì cho phép bạn vẽ trên widget cơ bản sử dụng thêm các widget đặt trên đầu trang của họ. Nó đơn giản, ngay cả :) Đạo cụ đi đến mô hình dựng hình widget mới được giới thiệu trong IIRC Qt 4.1. –

+0

@KubaOber Bạn hoàn toàn đúng, nhưng đó không phải là những gì OP hỏi. OP hỏi nếu một widget container có thể vẽ trên các widget con - câu trả lời là không. Giải pháp của bạn là một giải pháp có thể, nhưng vì nó không liên quan đến việc vẽ lớp có nguồn gốc từ 'QDockWidget' trên các widget chứa, nó không trả lời câu hỏi của OP. – cmannett85

+1

Nó cung cấp một giải pháp. Tiện ích vùng chứa là miễn phí để thêm tiện ích con cho chính nó. Chắc chắn mã vẽ không đi vào 'paintEvent' của container, nhưng ai quan tâm đến điều đó. –