c++ - 如何将函数指针传递给方法,以便可以在 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())
.
解决方案
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
或其他东西。
推荐阅读
- javascript - 如何在不删除现有事件但阻止表单提交的情况下添加事件
- python - Linux epoll 系统调用,等待数据可用
- azure-log-analytics - 在日志分析中使用包含 XML 的数据字段来汇总 Windows 事件
- r - 如何查找购买物品及其组合的次数?
- fullcalendar - EXDATE 是否不包含在完整日历的规则中
- reactjs - 使用 Webpack 为 RTL 和 LTR 支持生成两个不同的索引文件
- linux - 如何将列输出合并到前一列的行尾?
- android - 经过一段时间后的 Firebase 事件
- javascript - 如何使用 forEach 更新符合此条件的所有值
- python - 如何在 Django 中为产品实现添加到愿望清单?