我正在尝试将枚举作为值传递给程序中的插槽,但我遇到了一些问题。在我的头文件中,我创建了枚举:
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
有人能为我解释一下吗?
谢谢!
马龙
答案 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()
功能来了解,按下了什么按钮。