如何使用QSignalMapper发送自定义结构的实例

How to send instance of custom struct with QSignalMapper?

本文关键字:结构 实例 自定义 何使用 QSignalMapper      更新时间:2023-10-16

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

我设法使用 qSignalMapper 通过子级 qObject 来封装我的struct的实例。但是,当我的结构到达插槽中时,我的结构的所有值都是不正确的 - 它们似乎是不法的。

如果我发送原始类型,例如 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;
}

而不是使用QSignalMapper,它迫使您创建一个自定义struct_wrapper,请尝试使用qaction :: setData方法,该方法接受任何qvariant

另外,请确保使用Q_Declare_metatype

将其结构注册到QT Metatype系统

然后,只需将所有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;)

为什么您不仅使用自定义类来完成工作?通过从qobject派生并使用一些插槽/信号来完成您想要的。

我不知道为什么您的结构会获得无效的值,因此最好将代码作为示例:)

soo long zaiborg

void on_selected(QObject * structWrapper)
{
    /* Get structure */
    MY_STRUCT myStruct = structWrapper->GetStruct();
    /* ID is always uninitialised */
    int id = myStruct.ID;
}

我认为问题是,一个qobject*不知道GetStruct()应该做什么...它应该在编译OO

时丢弃错误

也许尝试

MY_STRUCT myStruct = <dynamic_cast>(STRUCT_WRAPPER*)->GetStruct();

感谢所有有用的指针。

最后,我意识到我需要映射的唯一信息是结构数组中的索引。通过将数组全局制作,我能够使用通过的索引从插槽访问它。

在这种情况下,我不想使用q_declare_metatype,因为我宁愿对我的API库有QT依赖关系。否则,Octal的建议也将有效。