2011-08-11 2 views
1

J'essaie de passer une enum comme valeur à un slot dans mon programme, mais j'ai quelques problèmes. Dans mon fichier d'en-tête, je l'ai créé le ENUM:Qt signal avec une enum comme paramètre

Q_ENUMS(button_type); 
enum button_type {button_back, button_up, button_down, button_ok}; 
Q_DECLARE_METATYPE(button_type); 

Et dans mon fichier .cpp je suis en train de passer à une fente:

QObject::connect(buttons->ui.pushButton_back, SIGNAL(clicked()), this, SLOT(input_handler(button_back))); 

Mais quand je compiler le code que je reçois :

Object::connect: No such slot main_application::input_handler(button_back) in main_application.cpp:44 
Object::connect: (sender name: 'pushButton_back') 
Object::connect: (receiver name: 'main_applicationClass') 

Il compile et fonctionne correctement si je ne transmets pas un argument à input_handler.

J'ai également lu que je devrais appeler qRegisterMetaType, mais je n'arrive pas à obtenir la syntaxe correcte. Voici ce que j'ai essayé:

qRegisterMetaType<button_type>("button_type"); 

mais je reçois cette erreur:

main_application.h:15:1: error: specializing member ‘::qRegisterMetaType<button_type>’ requires ‘template<>’ syntax 

Quelqu'un peut-il faire la lumière sur ce pour moi?

Merci!

Marlon

+0

Rien à propos de cette erreur "memberizing ..." ...? – Smar

Répondre

1

vous passez la SLOT() une valeur macro quand il attend un type. Plus fondamentalement, cela n'a pas beaucoup de sens de toute façon puisque ce que vous avez du mal à faire, c'est de faire passer la fente à un niveau constant. Pourquoi ne pas simplement utiliser button_back dans la fonction de logement directement?

Vous peut définir une fente qui prend une valeur button_type, mais vous auriez besoin de se connecter à un signal qui passe un comme paramètre.

Qu'essayez-vous vraiment de faire?

0
Object::connect: No such slot main_application::input_handler(button_back) 

Bien sûr, il est, parce que la signature est main_application::input_handler(button_type) et button_back est une valeur, tapez pas. Et même si vous faites la bonne signature, vous ne pourrez pas connecter ce signal et cette fente en raison de leur différence de signature.

En outre, vous pouvez toujours utiliser QObject::sender() fonction pour se faire connaître, quel bouton a été enfoncé.

3

Le signal et l'emplacement doivent avoir les mêmes paramètres. Ce que vous voulez, c'est un QSignalMapper.

éditer: Voici un exemple d'une application du mien. Il crée 10 actions de menu qui sont chacune connectées au même emplacement gotoHistoryPage mais appelées avec une valeur int différente.

m_forwardMenu = new QMenu(); 
for(int i = 1; i<=10; i++) 
{ 
    QAction* action = m_forwardMenu->addAction(QString("%1").arg(i)); 
    m_forwardActions.push_back(action); 
    m_signalMapper->setMapping(action, i); 
    connect(action, SIGNAL(triggered()), m_signalMapper, SLOT(map())); 
} 
ui.forwardButton->setMenu(m_forwardMenu); 
connect(m_signalMapper, SIGNAL(mapped(int)), this, SLOT(gotoHistoryPage(int)));