Qt Issue - кнопка мыши отпущена после закрытия модального QDialog

Родительский виджет не реагирует на первый щелчок мыши после закрытия Modal QDialog, QDialog закрывается вызовом done() в mousemoveevent(), и это приводит к тому, что кнопка мыши все еще нажата после закрытия диалогового окна, второй щелчок будет работать как обычно.

Мой вывод на данный момент:

  1. Если done(int) вызывается в MouseReleaseeEvent(), все работает как положено

  2. Похоже, что в QDialog отсутствует событие MouseButtonRelease (которое ожидается после запуска события MouseButtonPress) из-за того, что QDialog уже закрыто в MouseMoveEvent, и это портит событие мыши родительского виджета.

Мое намерение состоит в том, чтобы сделать QDialog, который можно закрыть, сдвинув его, когда он обнаружит, что мышь нажата и перемещена в определенную позицию, он будет закрыт.

Буду очень признателен, если все, кто сталкивался с этим раньше или кто имеет представление о том, что происходит, дадут мне несколько советов.

ОГРОМНОЕ СПАСИБО.

Кроме того, это первый раз, когда я публикую здесь вопрос, если я пропустил какую-либо информацию, которую я должен предоставить, пожалуйста, дайте мне знать...


person Casey Lim    schedule 12.10.2012    source источник
comment
Вы вызываете родительское событие mousemoveevent?   -  person fonZ    schedule 16.10.2012
comment
Возможно, вы могли бы вызвать событие mouserelease вручную в событии закрытия. Вероятно, это хак, но он сработает, если остальные не сработают.   -  person fonZ    schedule 16.10.2012
comment
Спасибо, Джон! Я попытался вручную вызвать событие mouserelease, но безуспешно. Похоже, что QDialog настаивает на полной процедуре (mousepress + mouserelease), прежде чем он сможет правильно вернуть элемент управления своему родителю. Мой текущий обходной путь - вызывать событие закрытия только после того, как пользователь отпускает мышь/касание, и все работает нормально. Мне любопытно, кто-нибудь внедрил в Qt слайдер, похожий на iphone, для разблокировки интерфейса, и как это было сделано?   -  person Casey Lim    schedule 22.10.2012


Ответы (1)


Это работает отлично, без каких-либо анимаций, но их можно добавить. По сути, он ищет разницу в координате x, когда мышь начала двигаться, если она выше или ниже 2 (сдвиньте влево или вправо), диалоговое окно закроется.

int x;

void MyDialog::mousePressEvent(QMouseEvent * event) {
    x = event->globalPos().x();
}

void MyDialog::mouseReleaseEvent(QMouseEvent * event) {
    int diff = x - event->globalPos().x();
    qDebug(tr("released").arg(diff).toUtf8().constData());
    if (diff > 2 || diff < -2) QDialog::close();
}

Я не вижу никакой проблемы.

person fonZ    schedule 22.10.2012
comment
Еще раз спасибо за потраченное на это время. Как я уже сказал, вызов close() в mouseReleaseEvent не вызывает никаких проблем. Не возражаете ли вы попробовать вызвать close() в mouseMoveEvent, возможно, вы могли бы смоделировать ту же проблему. - person Casey Lim; 23.10.2012
comment
Я не думаю, что вы хотите вызвать закрытие при нажатии, но я проверил это, я вызываю закрытие, когда срабатывает mousePressEvent, и все работает нормально. Диалог закрывается, как и ожидалось. - person fonZ; 23.10.2012