Правильное размещение заставки QT на 2 экранах

Мое приложение при запуске создает своего рода «заставку» с кнопками быстрого доступа к «Открыть», «Новый» и т. Д. Это окно-заставка размещается в середине экрана, а главное окно приложения находится за ним.

Вот код, чтобы сделать это:

void MainWindowButtonDialog::showMe()
{
    setModal(false);
    setWindowFlags(
        #ifdef Q_WS_WIN
            Qt::SplashScreen |
        #endif
            Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);

    QDesktopWidget *d = QApplication::desktop();
    QRect t = d->availableGeometry(this);
    move(mapToGlobal(this->geometry().topLeft()).x() + t.center().x() - width() / 2, 
         t.center().y()- height() / 2);
    show();
    raise();
}

Однако у меня есть некоторые проблемы, когда приложение работает на двух мониторах. Происходит следующее: экран-заставка, независимо от того, где запускается приложение, всегда создается на первом экране. Так что, если оконный менеджер решит открыть приложение на втором экране, заставка будет далеко-далеко в середине первого экрана... Что довольно некрасиво :(

Любая идея, как это можно исправить?


person Ferenc Deak    schedule 21.08.2013    source источник
comment
Что-то вроде экрана-заставки. Вы не используете виджет QSplashScreen?   -  person TheDarkKnight    schedule 21.08.2013
comment
Нет, просто отображение окна верхнего уровня, так как я также хочу, чтобы главное окно приложения было доступно, пока есть экран-заставка, и при первом значимом действии из главного окна заставка исчезает.   -  person Ferenc Deak    schedule 21.08.2013
comment
Является ли окно дочерним элементом главного окна или независимым?   -  person TheDarkKnight    schedule 21.08.2013
comment
@ Merlin069 это независимое окно   -  person Ferenc Deak    schedule 21.08.2013
comment
Можно добавить в детстве?   -  person TheDarkKnight    schedule 21.08.2013
comment
@ Merlin069 Удивительно :) Теперь все получилось именно так, как должно быть! Можете ли вы сформулировать ответ, чтобы я мог его принять?   -  person Ferenc Deak    schedule 21.08.2013
comment
Хорошо сделано и рад, что мы добрались до конца ;О)   -  person TheDarkKnight    schedule 21.08.2013


Ответы (2)


Если вы добавите экран-заставку в качестве дочернего элемента к MainWindow, его начальные координаты должны быть установлены таким образом, чтобы он отображался прямо поверх своего родителя.

person TheDarkKnight    schedule 21.08.2013

Попробуйте вызвать availableGeometry() не с виджетом в качестве параметра, а с номером экрана. Что-то вроде

int screen = d->primaryScreen();
QRect t = d->availableGeometry(screen);
person Batox    schedule 21.08.2013
comment
Нет, теперь всплывающее окно всегда появляется на основном экране, независимо от того, отображается ли основное окно на втором экране. - person Ferenc Deak; 21.08.2013