0

我有一个自定义结构,它的哪些实例与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;
}
4

4 回答 4

1

不要使用 QSignalMapper,它会强制您创建自定义 STRUCT_WRAPPER,而是尝试使用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;)
于 2012-11-08T15:50:17.213 回答
0

你为什么不只是使用自定义类来完成这项工作?通过从 qobject 派生它并使用一些插槽/信号,它会做你想要的。

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

Soo long zaiborg

于 2012-11-08T14:59:12.970 回答
0
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();
于 2012-11-08T15:32:32.587 回答
0

感谢所有有用的指针。

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

在这种情况下,我不想使用 Q_DECLARE_METATYPE,因为我宁愿在我的 API 库上没有 QT 依赖项。否则,八进制的建议也会奏效。

于 2012-11-13T10:56:24.707 回答