c++ - 如何使用 QSignalMapper 发送自定义结构的实例?

标签 c++ qt struct signals-slots

我有一个自定义结构,它的实例与 QAction 实例相关联。我希望在执行操作时使用我的结构的相应实例执行槽。

我设法使用 QSignalMapper 通过对 QObject 进行子类化以封装我的结构实例来实现此功能。但是,我的结构的所有值在到达插槽时都不正确 - 它们似乎未初始化。

如果我发送一个原始类型,例如 int 来代替结构,甚至发送类似 QAction 的东西,一切正常。

是否有可能做我想做的事?如果是这样,我错过了什么?

谢谢, 艾伦

编辑:添加代码示例

以下是我如何连接 QSignalMapper。注意:STRUCT_WRAPPER 派生自 QObject。

/* Connect signal mapper to selected slot */
connect(signalMapper, SIGNAL(mapped(QObject *)), this, 
    SLOT(on_selected(QObject *)));

/* For all structures */
for(x = 0; x < structureCount; x++)
{
    /* Create action */
    QAction * action = ui.menu->addAction("Name");

    /* Get current structure */
    MY_STRUCT myStruct = structList[x];

    /* Create wrapper */
    STRUCT_WRAPPER * structWrapper = new STRUCT_WRAPPER(this, myStruct);

    /* Map struct to action */
    signalMapper->setMapping(action, structWrapper);
}

这是我获取未初始化值的位置:

void on_selected(QObject * object)
{
    /* Get structure wrapper */
    STRUCT_WRAPPER * structWrapper = (STRUCT_WRAPPER *)object;

    /* Get structure */
    MY_STRUCT myStruct = structWrapper->GetStruct();

    /* ID is always uninitialised */
    int id = myStruct.ID;
}

最佳答案

不要使用强制您创建自定义 STRUCT_WRAPPER 的 QSignalMapper,而是尝试使用 QAction::setData方法,它接受任何 QVariant

此外,请确保使用 Q_DECLARE_METATYPE 将您的结构注册到 Qt 元类型系统。

然后,只需将所有 QAction 连接到同一个插槽,并使用 http://qt-project.org/doc/qt-4.8/qobject.html#sender检索发出信号的 QAction:

void MyWindow::on_selected() {
    QAction *action = qobject_cast<QAction *>(sender());
    Q_ASSERT(action);

    MY_STRUCT myStruct = action->data().value<MY_STRUCT>();
}

另外,避免使用 C 风格的转换。如果你向下转换 QObjects,请改用 qobject_cast(它依赖于 MetaObject 信息并且不需要额外的 RTTI 功能):

STRUCT_WRAPPER * structWrapper = qobject_cast<STRUCT_WRAPPER *>(object;)

关于c++ - 如何使用 QSignalMapper 发送自定义结构的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13291328/

相关文章:

c - 如何释放堆栈分配结构的 malloc 属性?

c - 如何分配内存并用指向二维数组的指针填充结构

c++ - void指针函数的使用

c++ - 为所有 iOS 架构编译 c++ 文件

c++ - QVariant userType() id

c++ - 我可以有正确的 qmake,但有错误的 qt 吗?

python - Qt 调试崩溃/退出 python 并最终无法正确调试(例如,不在断点处停止)

c++ - 我应该如何部署 MFC 应用程序?

c++ - 不使用 dynamic_cast<...>() 如何知 Prop 体的对象类型

c - 结构指针数组的问题