Получить нажатия клавиш в 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();
...