Qt, проблема с QTimer при использовании QMessageBox в QkeyPressedEvent - PullRequest
0 голосов
/ 25 марта 2020

Функция: Когда я нажимаю клавишу один раз, вызывается keyPress, слот, связанный с QTimer, вызывается один раз, KeyReleased вызывается, QTimer останавливается. Когда я продолжаю нажимать клавишу «вверх», клавиша «Нажата» вызывается, слот на QTimer вызывается каждые 2 секунды, когда я отпускаю клавишу вверх, вызывается KeyReleased, QTimer останавливается. Все идет хорошо без QMessageBox. Проблема: Когда я добавляю QMessageBox в слот, KeyReleased никогда не будет вызываться и QTimer никогда не будет останавливаться.

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    connect(&m_keyUpTimer, &QTimer::timeout, this, &MainWindow::slotKeyUpTimerTimeOut);
}

MainWindow::~MainWindow()
{
}

void MainWindow::keyPressEvent( QKeyEvent * e)
{
    if (e->isAutoRepeat()) {
        return;
    }
    switch (e->key()) {
    case Qt::Key_Up:
    {
        QMessageBox errorMsg;
        errorMsg.setWindowTitle("Press");
        errorMsg.show();


        if (!m_keyUpTimer.isActive() ) {
            m_keyUpTimer.start(2000);
        }
        break;
    }
    default: break;
    }
}

void MainWindow::keyReleaseEvent(QKeyEvent * e)
{
    if (e->isAutoRepeat()) {
        return;
    }
    switch (e->key()) {
    case Qt::Key_Up:
    {
        m_keyUpTimer.stop();
        QMessageBox errorMsg;
        errorMsg.setWindowTitle("Release");
        errorMsg.show();
        break;
    }

    default: break;
    }
}

void MainWindow::slotKeyUpTimerTimeOut() const
{
    QMessageBox errorMsg;
    errorMsg.setWindowTitle("Slot");
    errorMsg.show();
}

Извините за мой плохой английский sh.

...