2012-06-14 9 views
5

Ho una classe in Qt che eredita QDockWidget. E quella classe contiene un altro widget. C'è qualche possibilità di definire una funzione nella mia classe ereditata QDockWidget che disegna roba in cima al widget contenuto? Come il dipinto, essere indipendente dal widget contenuto ma essere collegato alla classe ereditata.Paint/Disegna sopra i widget agganciati in QDodckWidget

Grazie

risposta

8

Certo che è possibile. È abbastanza semplice da fare, infatti. Devi posizionare un widget figlio che si sovrapponga a tutto il resto nel tuo QDockWidget. Per farlo, deve essere l'ultimo widget figlio che aggiungi al tuo dockwidget. Quel widget non deve disegnare il suo background, e può quindi disegnare su qualsiasi figlio del dockwidget. Le dimensioni del widget devono tenere traccia delle dimensioni del widget genitore.

Di seguito è un esempio compilabile autonomo.

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

per quanto ne so: No.

Widget sono disegnati in modo approfondito, in modo qualunque sia il vostro QDockWidget vernici classe derivata, saranno estratti nel corso dei widget contenute quando vengono aggiornate (subito dopo senza dubbio , perché gli aggiornamenti delle vernici vengono propagati ai widget secondari).

+0

che il disegno in modo approfondito è precisamente ciò che permette di disegnare sopra i widget sottostanti utilizzando i widget aggiuntivi posizionati su di essi. È semplice, anche :) I puntelli vanno al nuovo modello di rendering dei widget introdotto in IIRC Qt 4.1. –

+0

@KubaOber Hai assolutamente ragione, ma non è quello che l'OP chiedeva. L'OP ha chiesto se un widget del contenitore può dipingere sui widget figli - la risposta è no. La soluzione è una soluzione possibile, ma poiché non coinvolge una classe derivata 'QDockWidget' su widget contenuti, non risponde alla domanda dell'OP. – cmannett85

+1

Offre una soluzione. Il widget contenitore è libero di aggiungere un widget figlio a se stesso. Certo, il codice della pittura non entra nel 'paintEvent' del contenitore, ma a chi importa. –