Bonjour à tous,
Je rencontre un problème de slot, je vous explique en détail.
Je développe un système d'onglet pour m'exercer, j'ai trois classe: SLGroupTab(représente une barre d'onglet), SLAbstractTab(représente un onglet) et SLDockTab(fille de SLAbstractTab).
Pour gérer la réorganisation des onglets avec la souris j'implémente mousePressEvent, mouseMoveEvent et mouseReleaseEvent dans SLGroupTab. Pour donner l'illusion du déplacement d'un onglet, je récupérè l'instance de l'onglet cliqué puis je le cache avec la méthode setVisible de QWidget(que j'ai surchargé pour cause de problème de layout). Dans cette méthode je fais appel au slot update qui en théorie devrait faire appel à paintEvent mais ne le fais pas.
Je vous passe le code ce sera peut être plus clair ^^.
SLGroupTab
SLAbstractTab
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 void SLGroupTabPrivate::mousePressEvent(QMouseEvent *event) { if(event->button() != Qt::LeftButton) { event->ignore(); return; } this->_pressedIndex = this->indexAtPos(event->pos()); this->_dragTrigger = event->pos(); event->accept(); qDebug() << "press"; } void SLGroupTabPrivate::mouseReleaseEvent(QMouseEvent *event) { if(event->button() != Qt::LeftButton) { event->ignore(); return; } this->_tab.at(this->_pressedIndex)->setVisible(true); //this->_pressedTabPixmap->hide(); qDebug() << "release"; event->accept(); } void SLGroupTabPrivate::mouseMoveEvent(QMouseEvent *event) { if(this->_pressedIndex == -1 && event->button() != Qt::LeftButton) { event->ignore(); return; } if((event->pos() - this->_dragTrigger).manhattanLength() < QApplication::startDragDistance()) return; //QRect r = this->tabRect(this->_pressedIndex); /*this->_pressedTabPixmap->setPixmap(this->_tab.at(this->_pressedIndex)->grab()); this->_pressedTabPixmap->move(r.x(), r.y()); this->_pressedTabPixmap->show();*/ if(this->_tab.at(this->_pressedIndex)->isVisible()) { qDebug() << "visible"; this->_tab.at(this->_pressedIndex)->setVisible(false); } qDebug() << event->pos(); event->accept(); }
Dans SLGroupTab j'ai un QList<SLAbstractTab*> avec des instances de SLDockTab, donc je fais appel à setVisible de SLDockTab et aucun problème, mais le slot update ne repeint pas le widget et je ne comprend pas pourquoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void SLAbstractTab::setVisible(bool visible) { D(SLAbstractTab); d->_visible = visible; this->update(); qDebug() << "update"; }
Merci d'avance.
PS: Je n'ai pas mis beaucoup de code, mais si vous voulais plus d'information sur celui-ci aller jeter un coup d’œil sur mon dépôt Git https://bitbucket.org/SmartSoftwareM...Gui?at=develop.
Partager