QSignalMapper не вызывает сопоставление

Недавно я обнаружил проблему с 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 я пытаюсь подключить клавиатуру Closed к 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*) не является. Почему и как я могу добиться того, чего хочу?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]