0

QActionインスタンスに関連付けられているインスタンスのカスタム構造体があります。アクションの実行時に、構造の対応するインスタンスでスロットを実行したいと思います。

QObjectをサブクラス化して構造体のインスタンスをカプセル化することにより、QSignalMapperを使用してこれを機能させることができました。ただし、スロットに到着したときの構造体の値はすべて正しくありません。初期化されていないようです。

構造体の代わりに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

カスタム STRUCT_WRAPPER の作成を強制する QSignalMapper を使用する代わりに、任意の QVariant を受け入れるQAction::setDataメソッドを使用してみてください。

また、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 スタイルのキャストは使用しないでください。QObject をダウンキャストしている場合は、代わりに qobject_cast を使用します (MetaObject 情報に依存し、追加の RTTI 機能は必要ありません)。

STRUCT_WRAPPER * structWrapper = qobject_cast<STRUCT_WRAPPER *>(object;)
于 2012-11-08T15:50:17.213 に答える
0

なぜあなたは仕事をするためにカスタムクラスを使用しないのですか?qobjectから派生し、いくつかのスロット/シグナルを使用することで、必要な処理を実行できます。

構造体が無効な値を取得する理由がわからないので、例としてコードを取得するとよいでしょう:)

とても長いzaiborg

于 2012-11-08T14:59:12.970 に答える
0

便利なポインタをすべてありがとう。

結局、マッピングする必要のある情報は、構造体の配列内のインデックスだけであることに気付きました。配列をグローバルにすることで、渡されたインデックスを使用してスロットから配列にアクセスできました。

この場合、APIライブラリにQTの依存関係を持たせたくないので、Q_DECLARE_METATYPEを使用したくありませんでした。そうでなければ、8進数の提案も機能していたでしょう。

于 2012-11-13T10:56:24.707 に答える
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 に答える