Сигнал Qt с перечислением в качестве параметра - PullRequest
1 голос
/ 11 августа 2011

Я пытаюсь передать enum как значение в слот в моей программе, но у меня возникли некоторые проблемы.В моем заголовочном файле я создал enum:

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

И в своем файле .cpp я пытаюсь передать его в слот:

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

Но когда я компилируюкод, который я получаю:

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')

Он компилируется и работает нормально, если я не передаю аргумент input_handler.

Я также прочитал, что должен вызывать qRegisterMetaType, но яне могу получить правильный синтаксис.Вот что я попробовал:

qRegisterMetaType<button_type>("button_type");

но я получаю эту ошибку:

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

Может кто-нибудь пролить свет на это для меня?

Спасибо!

Marlon

Ответы [ 3 ]

3 голосов
/ 11 августа 2011

Сигнал и слот должны иметь одинаковые параметры. То, что вы хотите, это QSignalMapper.

редактирование: Вот пример из моего приложения. Он создает 10 действий меню, каждое из которых подключено к одному и тому же слоту gotoHistoryPage, но каждое из них вызывается с другим значением int.

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)));
1 голос
/ 11 августа 2011

Вы передаете макросу SLOT() значение, когда он ожидает тип.В сущности, в любом случае это не имеет особого смысла, так как то, чего вы пытаетесь достичь, это передать слот константу.Почему бы просто не использовать button_back в функции слота напрямую?

Вы можете определить слот, который принимает значение button_type , но тогда вам нужноподключить его к сигналу, который передает единицу в качестве параметра.

Что вы на самом деле пытаетесь сделать?

0 голосов
/ 11 августа 2011
Object::connect: No such slot main_application::input_handler(button_back)

Конечно, есть, потому что подпись - main_application::input_handler(button_type), а button_back - это значение, а не тип.И даже если вы сделаете правильную подпись, вы не сможете соединить этот сигнал и слот из-за их несовпадения подписи.

Кроме того, вы всегда можете использовать функцию QObject::sender(), чтобы узнать, какая кнопка была нажата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...