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?
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
@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
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. –