Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用QSignalMapper发送自定义结构的实例?_C++_Qt_Struct_Signals Slots - Fatal编程技术网

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

C++ 如何使用QSignalMapper发送自定义结构的实例?,c++,qt,struct,signals-slots,C++,Qt,Struct,Signals Slots,我有一个自定义结构,它的实例与QAction实例关联。我希望在执行操作时,使用结构的相应实例执行一个插槽 我使用QSignalMapper通过对QObject进行子分类来封装我的结构的一个实例,成功地实现了这一点。然而,当my struct的所有值到达插槽时都是不正确的-它们似乎未初始化 如果我发送一个基本类型,例如int来代替struct,或者甚至像QAction这样的东西,那么一切都正常 有可能做我想做的事吗?如果是,我错过了什么 谢谢, 艾伦 编辑:添加代码示例 下面是我如何连接QSign

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

我使用QSignalMapper通过对QObject进行子分类来封装我的结构的一个实例,成功地实现了这一点。然而,当my struct的所有值到达插槽时都是不正确的-它们似乎未初始化

如果我发送一个基本类型,例如int来代替struct,或者甚至像QAction这样的东西,那么一切都正常

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

谢谢, 艾伦

编辑:添加代码示例

下面是我如何连接QSignalMapper的。注意:STRUCT_包装器派生自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);
}

为什么不使用自定义类来完成这项工作?通过从qobject派生它,并使用一些插槽/信号,它将执行您想要的操作

我不知道为什么您的结构会得到无效值,所以最好得到一些代码作为示例:)

苏隆在堡酒店

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();
MY_STRUCT myStruct=(STRUCT_WRAPPER*)->GetStruct();

不要使用QSignalMapper,它会强制您创建自定义结构包装,请尝试使用接受任何QVariant的方法

另外,请确保通过使用将结构注册到Qt元类型系统

然后,只需将所有QAction连接到同一插槽,并使用来检索发出信号的QAction:

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

    MY_STRUCT myStruct = action->data().value<MY_STRUCT>();
}
void MyWindow::on_selected(){
QAction*action=qobject_cast(发送方());
Q_断言(行动);
MY_STRUCT myStruct=action->data().value();
}
另外,避免使用C样式转换。如果要向下转换qobject,请改用qobject_cast(它依赖于元对象信息,不需要额外的RTTI功能):

STRUCT\u WRAPPER*structWrapper=qobject\u cast(object;)

感谢所有有用的提示

最后,我意识到我需要映射的唯一信息是结构数组中的索引。通过使数组全局化,我可以使用传递的索引从插槽访问它


在本例中,我不想使用Q_DECLARE_元类型,因为我不希望在API库上有QT依赖关系。否则,octal的建议也会起作用。

结构是API的一部分,但我可能会按照您的建议将其数据存储在自定义类中。这看起来是最干净、最简单的方法——显然不是。有关代码示例,请参阅我编辑的问题。抱歉,我已经在做类似的操作,但忘记将其包含在我的代码示例中。请参见编辑的问题以获得澄清。
MY_STRUCT myStruct=structList[x]您正在将myStruct连接到信号。。。请尝试使用
MY_STRUCT*myStruct=&structList[x]因此,可能您将一个无效的结构连接到了您的函数,我希望您将其清除,因为调用
new struct\u WRAPPER()
您可能也会收到一些泄漏,谢谢您提供的信息。这看起来是个不错的选择。
void MyWindow::on_selected() {
    QAction *action = qobject_cast<QAction *>(sender());
    Q_ASSERT(action);

    MY_STRUCT myStruct = action->data().value<MY_STRUCT>();
}
STRUCT_WRAPPER * structWrapper = qobject_cast<STRUCT_WRAPPER *>(object;)