2013-02-14 11 views
5

Ho un QStackedWidge t all'interno di un QDockWidget - a seconda di quale pagina è indicata desidero mostrare/nascondere il pulsante di chiusura sul QDockWidget. Posso farlo usando QDockWidget::setFeatures().Come catturare l'evento QDockWidget pulsante di chiusura click

Tuttavia il problema che sto affrontando è come catturare il segnale del pulsante di chiusura in modo da poter modificare le caratteristiche del dock/impostare l'indice della pagina del widget impilato.

QDockWidget close button

ho tentato di usare un filtro eventi:

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); 
} 

e installato come così:

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

Nel costruttore della mia QMainWindow - il metodo eventFilter() non ha fatto essere chiamato

Così la prossima ho cercato di utilizzare il segnale modificato QDockWidget::visibilityChanged in quanto sembrava che questo potrebbe essere quello che volevo:

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

Questo slot fatto ottenere chiamato - ma non quando il pulsante di chiusura è stato cliccato.

Infine, ho tentato di utilizzare un codice promozionale QDockWidget per acquisire lo 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(); 
    } 
}; 

ho visto il costruttore è stato chiamato il che significa che questo nuovo widget è stato effettivamente utilizzato, ma ancora nessuna gioia dal momento che il closeEvent() non è mai stato chiamato quando il pulsante di chiusura è stato cliccato.

risposta

0

Scoprire che tutto a parte il segnale visibilityChanged funziona!

Ho aggiunto un segnale al metodo closeEvent() sostituito che potevo quindi collegare a qualsiasi slot che volevo.

Il problema reale era che all'interno del widget impilato avevo un altro QDockWidget su un'altra pagina, quindi stavo aggiungendo tutte queste cose allo QDockWidget errato! (E ovviamente ha promosso il QDockWidget sbagliato anche doh!).

Speriamo che questa domanda possa servire come riferimento per chiunque altro debba capire come farlo, piuttosto che perché non funziona.

+0

Ho usato il segnale QObject :: destroyed() come descritto in http://stackoverflow.com/questions/7091830/qt-destructor-call-for-closed-widget – vrogach