首页 > 解决方案 > 如何将函数指针传递给方法,以便可以在 Qt 的 connect() 中使用?

问题描述

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

实际的插槽位于 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++qtqactionqt-slot

解决方案


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

以上应该是:

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

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

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


推荐阅读