gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:53:09 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com