Получить нажатия клавиш в QSplashScreen на OSX

Я пытаюсь получить нажатия клавиш из QSplashScreen до того, как откроется мое главное окно. Мой класс-заставка наследуется от QSplashScreen и переопределяет метод keyPressEvent.

Приведенный ниже код работает в Windows, но в OSX нажатия клавиш не перехватываются, пока не откроется главное окно.

Есть ли обходной путь для этого?

Это использует Qt 5.2.1, но я думаю, что эта проблема также есть в более ранних (4.X) версиях.

splash.cpp:

...

void Splash::keyPressEvent(QKeyEvent *evt)
{
     std::cout << evt->text().toStdString() << std::endl;
}

main.cpp:

...

void delay(float seconds)
{
     QTime dieTime= QTime::currentTime().addSecs(seconds);
     while( QTime::currentTime() < dieTime )
         QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

int main(int argc, char *argv[])
{
     QApplication a(argc, argv);

     Splash *splash = new Splash;
     splash->setPixmap(QPixmap(":/images/splash_loading.png"));
     splash->show();
     splash->grabKeyboard();

     // on OSX no keypresses captured here, on Windows keypresses captured
     delay(5.f);

     MainWindow w;
     w.show();

     // keypresses captured here on OSX and Windows
     delay(5.f);

     splash->releaseKeyboard();
     splash ->hide();

     return a.exec();
}

1 ответ

Я работал над этим, создавая невидимое окно перед созданием заставки.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Create a dummy window so that we get keypresses on OSX
    QLabel v(0, Qt::FramelessWindowHint);
    v.setMinimumSize(QSize(0, 0));
    v.move(0,0);
    v.show();

    Splash *splash = new Splash;
    splash->setPixmap(QPixmap(":/images/splash_loading.png"));
    splash->show();
    splash->grabKeyboard();

    // keypresses are now captured here
    delay(5.f);

    // hide the dummy window before showing the main one
    v.hide();
    MainWindow w;
    w.show();

    ...
Другие вопросы по тегам