我有一个自定义结构,它的实例与 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/