如何使用QSignalMapper发送自定义结构的实例
How to send instance of custom struct with QSignalMapper?
我有一个自定义结构,其中其中的实例与 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的建议也将有效。
- 如何从实现接口的模板化类实例访问结构
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- 如何在结构初始值设定项列表中实例化类
- 使用 c 头文件时,是否需要将 "struct" 放在 c++ 中的结构实例前面?
- 'class MyClass' 在尝试定义静态结构实例时不会命名类型
- C 设置STD :: MAP值为结构实例的指针
- 如何使用结构实例的名称调用其属性
- 使用 "struct" 关键字的结构实例化
- 从结构实例调用变量语法问题C++
- C 或 C++ 中的结构实例限制
- 如何在定义后创建指针和结构实例
- 不允许将结构实例分配给类实例
- 如何使用 boost::bind 将类/结构实例作为参数传递给回调
- 尝试创建结构实例时C++未声明的标识符
- 只有在结构实例的构造函数中满足条件时,才能创建该实例
- 我必须使用delete来避免内存泄漏吗?我使用new来分配结构实例
- C++错误:初始化结构实例的向量数组成员
- 类定义中产生编译器错误的结构实例
- 在结构实例的向量上丢失指针,在结构中带有指针