Qt以enum作为参数发出信号

时间:2011-08-11 17:57:29

标签: qt enums

我正在尝试将枚举作为值传递给程序中的插槽,但我遇到了一些问题。在我的头文件中,我创建了枚举:

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

有人能为我解释一下吗?

谢谢!

马龙

3 个答案:

答案 0 :(得分:3)

信号和插槽需要具有相同的参数。你想要的是一个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 :(得分:1)

当你想要一个类型时,你正在为SLOT()宏传递一个值。更根本的是,这无论如何都没有多大意义,因为你正在努力实现的是将时隙传递给常数。为什么不直接在插槽函数中使用button_back

可以定义一个带button_type 的插槽,但是你需要将它连接到一个作为参数传递一个的信号

你究竟想做什么?

答案 2 :(得分:0)

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

当然,因为签名是main_application::input_handler(button_type)button_back是值,而不是类型。即使您签名正确,由于签名不匹配,您也无法连接该信号和插槽。

此外,您始终可以使用QObject::sender()功能来了解,按下了什么按钮。