0

最近、QSignalMapper で問題が発生しました。トリガーする信号 (QObject*) をマップできません

現在、qml オブジェクトがkeyboard.qml割り当てられ、c++ クラスから削除されていますkeyboardManager.cpp。にkeyboard.qmlは、次の信号があります。

signal keyboardOpening
signal keyboardOpened
signal keyboardClosing
signal keyboardClosed

そしてこの機能:

function close() {
    popDelay.stop();
    closing = true;
    keyboardClosing();
    state = "OFFSCREEN";
}

シグナル

signal keyboardClosed

状態の変化に関連するすべてのアニメーションが終了したときにトリガーされます

C ++には、メソッドとスロットがあります

//method
void KeyboardManager::beginRemoveKeyboard(TouchTextField *target);
//slot
void KeyboardManager::endRemoveKeyboard(QObject *target);

beginRemoveKeyboard で、keyboardClosed を endRemoveKeyboard に接続して、メモリを解放し、すべてのポインターを適切に登録解除できるように、次のテストを行いました。

QMLで:

onKeyboardClosed: console.debug("closed");

C++ で:

void KeyboardManager::test() { qDebug() << "test"; }
void KeyboardManager::beginRemoveKeyboard(TouchTextField *target)
{
    NewKeyboard *currentKeyboard = m_keyboards.value(target);

    QSignalMapper* signalMapper = new QSignalMapper(this);

    QObject::connect(currentKeyboard, SIGNAL(keyboardClosed()), signalMapper, SLOT(map()));
    QObject::connect(currentKeyboard, SIGNAL(keyboardClosed()), this, SLOT(test()));
    signalMapper->setMapping(this, (QObject*)target);

    QObject::connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(endRemoveKeyboard(QObject*)));
    QMetaObject::invokeMethod(currentKeyboard, "close");
}
void KeyboardManager::endRemoveKeyboard(QObject *target)
{
    qDebug() << "deletion started";
    TouchTextField* actualTarget = qobject_cast<TouchTextField*>(target);
    NewKeyboard *currentKeyboard = m_keyboards.value(actualTarget);
    actualTarget->setKeyboard(NULL);
    m_keyboards.remove(actualTarget);
    delete currentKeyboard;
    if (sender())
        delete sender(); //QSignalMapper
}

ただし、KeyboardManager::beginRemoveKeyboard を呼び出して取得したとき:

[DEBUG]closed (qrc:///main.qml:24, )
[DEBUG] test (tmp/debug/moc/../../../include/keyboard/KeyboardManager.h:31, void KeyboardManager::test())

それだけです。KeyboardClosed()トリガーされることを意味する「削除開始」test()は呼び出されませんが、呼び出されendRemoveKeyboard(QObject*)ません。なぜ、どうすれば自分が望むものを達成できるのですか?

4

0 に答える 0