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