2012-06-14 52 views
5

में डॉक किए गए विगेट्स के शीर्ष पर पेंट/ड्रा करें मेरे पास क्यूटी में एक कक्षा है जो QDockWidget को प्राप्त करती है। और उस वर्ग में एक और विजेट है। क्या मेरे QDockWidget विरासत कक्षा में फ़ंक्शन को परिभाषित करने की कोई संभावना है जो निहित विजेट के शीर्ष पर सामान खींचती है? पेंटिंग को निहित विजेट से स्वतंत्र होने के लिए, लेकिन विरासत वर्ग से जोड़ा जाना पसंद है।QDodckWidget

धन्यवाद

उत्तर

8

निश्चित रूप से यह संभव है। वास्तव में, यह करना काफी आसान है। आपको अपने QDockWidget में अन्य सभी चीज़ों के शीर्ष पर बैठे एक बच्चे विजेट को रखने की आवश्यकता है। ऐसा करने के लिए, यह आपके डॉकविड्ज में जो अंतिम बच्चा विजेट जोड़ता है वह होना चाहिए। उस विजेट को अपनी पृष्ठभूमि खींचना नहीं चाहिए, और फिर यह डॉकविड्ज के किसी भी बच्चे को आकर्षित कर सकता है। विजेट के आकार को मूल विजेट के आकार को ट्रैक करना होगा।

नीचे एक आत्मनिर्भर संकलित उदाहरण है।

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: नहीं

विजेट गहराई क्रम में तैयार कर रहे हैं, इसलिए जो भी आपके QDockWidget व्युत्पन्न वर्ग पेंट, जब वे अपडेट किया जाता है (तुरंत बाद कोई संदेह नहीं है निहित विगेट्स से अधिक तैयार किया जाएगा , क्योंकि बाल अपडेट बाल विगेट्स के लिए प्रचारित होते हैं)।

+0

गहराई क्रम में ड्राइंग ठीक है यही कारण है कि आप उनमें से शीर्ष पर रखा अतिरिक्त विगेट्स का उपयोग कर अंतर्निहित विगेट्स से अधिक आकर्षित करने के लिए अनुमति देता है। यह आसान है, यहां तक ​​कि :) आईआईआरसी क्यूटी 4.1 में पेश किए गए नए विजेट प्रतिपादन मॉडल पर जाते हैं। –

+0

@ क्यूबाओबर आप बिल्कुल सही हैं, लेकिन ओपी ने यही नहीं पूछा। ओपी ने पूछा कि क्या एक कंटेनर विजेट बाल विगेट्स पर पेंट कर सकता है - जवाब नहीं है। आपका समाधान एक संभावित कामकाज है, लेकिन इसमें निहित विगेट्स पर 'QDockWidget' व्युत्पन्न क्लास पेंटिंग शामिल नहीं है, यह ओपी के प्रश्न का उत्तर नहीं देता है। – cmannett85

+1

यह एक समाधान प्रदान करता है। कंटेनर विजेट खुद को एक बच्चे विजेट जोड़ने के लिए स्वतंत्र है। निश्चित रूप से पेंटिंग कोड कंटेनर के 'पेंटएवेंट' में नहीं जाता है, लेकिन इसके बारे में कौन परवाह करता है। –