Pourquoi je n'arrive pas à dessiner sur n'importe quels widgets?
Certaine widgets sont basées sur QAbstractScrollArea dont le but est de permettre l'affichage d'une widget plus grande que sa zone d'affichage.
En ajoutant des scrollbar par exemple.
Appliquer un painter directement sur celle-ci n'aura pas l'effet souhaiter.
Cette class implemente la methode viewport() qui permet d'accéder à la widget qui est réellement affiché. Il faut donc appliquer le painter sur celle-ci.
Les widgets concernées sont QAbstractItemView, QGraphicsView, QMdiArea, QPlainTextEdit, QScrollArea, QTextEdit, QTextBrowser,
QColumnView, QHeaderView, QListView, QTableView, QTreeView,QHelpContentWidget, QTreeWidget, QTableWidget,QHelpIndexWidget, QListWidget, QUndoView,
voici un exemple utilisant une template pour choisir la class à tester.
Remarque 1 : le traitement pre-dessin se dessine en arrière plan et peut être totalement effacé par le dessin originel
Remarque 2 : le traitement post-dessin se dessinera au premier plan
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <QtGui>
/* T : class derivant de QAbstractScrollArea*/
template <typename T>
class myWidget : public T
{
public:
myWidget(QWidget *parent = 0)
: T(parent)
{
/*créé un second paintEvent pour résoudre certain problème d'affichage
dû à l'instant de la création de la widget accede par viewport()*/
QTimer::singleShot(0,this,SLOT(update()));
}
protected:
void paintEvent(QPaintEvent *event)
{
/*pre-dessin*/
if (this->viewport())
{
QPainter painter(this->viewport());
painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
painter.drawRect(QRect(10,10,50,50));
}
/*dessin originel*/
T::paintEvent(event);
/*post-dessin*/
if (this->viewport())
{
QPainter painter(this->viewport());
painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
painter.drawRect(QRect(100,100,50,50));
}
event->accept();
}
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
myWidget<QMdiArea> w;
w.show();
return app.exec();
} |
Partager