2012-05-06 17 views
5

Il mio problema è che quando clicco su un oggetto in una QMenuBar, lo slot corrispondente viene chiamato due volte. Sto usando Qt 4.8.1. Non sto utilizzando Qt Designer né la funzione "auto-connessione". Qui è il mio frammento di codice:Perché questo slot viene chiamato due volte?

#include <iostream> 
#include <QWidget> 
#include <QMenuBar> 

class MyWidget : public QWidget 
{ 
     Q_OBJECT 
     public: 
       MyWidget(QWidget *parent = 0) : QWidget(parent) 
       { 
         QMenuBar *menu = new QMenuBar(this); 
         menu->addAction("Click here"); 
         menu->addAction("Or here"); 
         connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(handleAction(QAction*))); 
       } 

     public slots: 
       void handleAction(QAction *action) 
       { 
         std::cout << "Triggered" << std::endl; 
       } 

}; 

e la funzione principale:

#include "main.h" 
#include <QApplication> 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    MyWidget w; 
    w.show(); 

    return app.exec(); 
} 

Se si compila questo (con il file MOC), vedrai che cliccando su "Clicca qui" stamperà " Attivato "una volta" e "O qui" due volte. Non capisco perché.

Cosa sto sbagliando?

+0

Spiacente non ho compilare il codice e non sono un mago qt. Ma ho esaminato l'esempio dalle pagine qt di nokia (http://qt-project.org/doc/qt-4.8/mainwindows-menus.html) e mi sembra che colleghino il segnale innescato a qualche slot in un altro modo: mentre si connette SIGNAL (attivato (QAction *)) si connettono SEGNALE (attivato()). Non posso dire se fa la differenza ma questo è un commento e non una risposta :-) – Matthias

+0

@Matthias: collegano le azioni agli slot direttamente in quegli esempi, pintoch è il segnale di connessione QMenuBar, che dovrebbe funzionare come lui lo intende a (Creare e connettere le azioni direttamente sarebbe una soluzione, ma non bella - lui/lei avrebbe bisogno di più slot o un signal mapper ...) – Mat

+0

Non è chiaro cosa stai * provando * a fare qui, ma sospetto che sia qualcosa diverso da quello che pensi - Questo in realtà non produrrà nemmeno una barra dei menu su OSX. Dovresti creare oggetti 'QMenu' e aggiungerli a' QMenuBar'. Sospetto che stia semplicemente inviando l'intero elenco di azioni al tuo spazio. –

risposta

2

Ottengo lo stesso risultato errato di Windows 7 x64 utilizzando Qt 4.8.1. Questo sicuramente sembra un bug.

c'era un bug reported and fixed per quello che sembra essere lo stesso comportamento su Mac OS X. Anche se è stato chiuso, non v'è un singolo commento su di esso che hanno osservato questo problema su Windows 7.

penso deposito una nuova segnalazione sarebbe una buona idea.

+0

Creo un nuovo problema sul bug tracker. Grazie per la tua conferma. – pintoch

Problemi correlati