2013-02-14 1 views
5

J'ai un QStackedWidge t dans un QDockWidget - en fonction de quelle page est affichée Je souhaite afficher/masquer le bouton de fermeture sur le QDockWidget. Je peux le faire en utilisant QDockWidget::setFeatures().Comment capturer l'événement de clic de bouton de fermeture QDockWidget

Cependant, le problème auquel je suis confronté est de savoir comment capturer le signal du bouton de fermeture afin de pouvoir modifier les fonctionnalités de la station d'accueil/définir l'index de la page du widget empilé.

QDockWidget close button

J'ai essayé d'utiliser un filtre d'événement:

class EventFilter : public QObject 
{ 
    Q_OBJECT 
public: 
    EventFilter(QObject* aParent); 
protected: 
    bool eventFilter(QObject *obj, QEvent *event); 
}; 

EventFilter::EventFilter(QObject* aParent) 
    : QObject(aParent) 
{ 

} 

bool EventFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::Close) 
    { 
     return true; 
    } 
    return QObject::eventFilter(obj, event); 
} 

et installé comme ceci:

EventFilter* filter = new EventFilter(this); 
u->dockWidget_6->installEventFilter(filter); 

Dans le constructeur de mon QMainWindow - la méthode eventFilter() n'a pas être appelé.

Alors, la prochaine je tentais d'utiliser le signal modifié QDockWidget::visibilityChanged car il semblait que cela pourrait être ce que je voulais:

connect(u->dockWidget_6, SIGNAL(visibilityChanged(bool)), SLOT(dockWindowClosed(bool))); 

Cet emplacement se fait appelé - mais pas lorsque le bouton de fermeture a été cliqué.

Enfin, j'ai tenté d'utiliser un QDockWidget promu pour capturer le QWidget::closeEvent().

class DockWidgetWithCloseSignal : public QDockWidget 
    { 
     Q_OBJECT 
    public: 
     explicit DockWidgetWithCloseSignal(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0) 
     : QDockWidget(title, parent, flags) 
    { 

    } 

    explicit DockWidgetWithCloseSignal(QWidget *parent = 0, Qt::WindowFlags flags = 0) 
: QDockWidget(parent, flags) 
    { 

    } 
protected: 
    void closeEvent(QCloseEvent *event) 
    { 
     event->ignore(); 
    } 
}; 

je vis le constructeur a été appelé ce qui signifie que ce nouveau widget est utilisé en effet, mais encore une fois pas de joie depuis le closeEvent() n'a jamais été appelé lorsque le bouton de fermeture a été cliqué.

Répondre

0

Il s'avère que tout sauf le signal visibilityChanged fonctionne!

J'ai ajouté un signal à la méthode closeEvent() surchargée que je pouvais ensuite connecter à n'importe quel emplacement que je voulais.

Le problème réel était que dans le widget empilé j'avais un autre QDockWidget sur une autre page, donc j'ajoutais toutes ces choses à la mauvaise QDockWidget! (Et bien sûr promu le mauvais QDockWidget trop doh!).

Espérons que cette question peut servir de référence à toute autre personne qui a besoin de comprendre comment faire cela - plutôt que de savoir pourquoi cela ne fonctionne pas.

+0

J'ai utilisé le signal QObject :: destroyed() comme décrit dans http://stackoverflow.com/questions/7091830/qt-destructor-call-for-closed-widget – vrogach

Questions connexes