【问题标题】:Qt signal with an enum as a parameter以枚举为参数的 Qt 信号
【发布时间】:2011-08-12 03:24:14
【问题描述】:

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

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

谁能帮我解释一下?

谢谢!

马龙

【问题讨论】:

  • 没有关于这个“专业成员...”错误...?

标签: qt enums


【解决方案1】:

Signal 和 Slot 需要有相同的参数。你想要的是一个 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)));

【讨论】:

    【解决方案2】:

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

    可以定义一个接收button_type的槽,但随后你需要将它连接到一个将一个作为参数传递的信号。

    你实际上想做什么?

    【讨论】:

      【解决方案3】:
      Object::connect: No such slot main_application::input_handler(button_back)
      

      当然有,因为签名是main_application::input_handler(button_type),而button_back是一个值,而不是类型。即使你做出正确的签名,你也无法连接那个信号和插槽,因为它们的签名不匹配。

      另外,您可以随时使用QObject::sender() 函数来了解按下了什么按钮。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 2010-09-16
        • 2011-05-30
        • 1970-01-01
        相关资源
        最近更新 更多