【问题标题】:How to pass a function pointer to a method so that it can be used in Qt's connect()?如何将函数指针传递给方法,以便可以在 Qt 的 connect() 中使用?
【发布时间】:2019-12-12 21:48:31
【问题描述】:

背景:我想动态创建上下文菜单的结构,并将操作项的槽传递给创建上下文菜单的方法。

实际的插槽位于 QWidget 类中。我通过传递函数指针尝试了不同的解决方案。但他们不编译。典型错误消息:“无法使用 'void (TextEdit::*)()' 类型的右值初始化 'void (*)()' 类型的参数”

这会编译,但不会触发所需的事件:

MenuBuilder builder(&parentMenu);
auto *subMenu = builder.createMenu(SECTION, this, SLOT(TextEdit::onInsertChars()));

以及对应的方法:

QMenu *MenuBuilder::createMenu(const MenuDescription &menuDescription,
    const QObject *receiver, const char *target) {
    ...
    inlineMenu->addAction(text, receiver, target);
    ...
}

我确信有一个明显的解决方案,但我想不通。


解决方案:在这种情况下,您必须传递 SLOT(onInsertChars()) 而不是 SLOT(TextEdit::onInsertChars())

【问题讨论】:

    标签: c++ qt qaction qt-slot


    【解决方案1】:
    auto *subMenu = builder.createMenu(SECTION, this, SLOT(TextEdit::onInsertChars()));
    

    以上应该是:

    auto *subMenu = builder.createMenu(SECTION, pointerToTheTextEdit, SLOT(onInsertChars()));
    

    (当然,如果onInsertChars()方法是进行上述调用的类中的一个槽,那么您可以将this作为指向具有onInsertChars()槽的对象的指针传递)

    此外,您可能希望在您的 createMenu() 函数中将 const char * slot 重命名为其他名称,因为 Qt 的 MOC 预处理器出于自己的目的已经声明了 slot 这个词,如果您尝试这样做可能会给您带来问题将其用作参数名称。也许将参数重命名为const char * slotName 或其他名称。

    【讨论】:

    • 感谢您的快速回复。 “this”确实是指向包含 onInsertChars() 方法的对象的指针。为了安全起见,我将参数重命名为“slot”。但不幸的是,这不是解决方案。
    • 请务必检查程序的 stdout/stderr 输出。通常,当 Qt 无法连接信号/插槽连接时,它会在此处打印一条警告消息,说明它无法连接的原因。
    • 是的,你给了我重要的提示!一切都设置正确,但我忙于编译器错误而没有注意 stderror 输出,它指出:“QObject::connect: No such slot TextEdit::TextEdit::onInsertChars()”。而不是 SLOT(TextEdit::onInsertChars()) 我必须通过 SLOT(onInsertChars())。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2012-04-15
    • 2013-10-27
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多