Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: posix от Январь 15, 2017, 08:25



Название: Как спрятать окно от Mission Control (macOS)
Отправлено: posix от Январь 15, 2017, 08:25
Задача была следующая, при запуске приложения, открывать два окна: QMainWindow и QDialog. QDialog должен быть скрыт от оконного менеджера, то есть пользователь не должен перемещать, ресайзить или закрывать это окно. Воспользовавшись Qt::WindowFlags я это и сделал:
Код:
Qt::SplashScreen | Qt::WindowStaysOnTopHint | Qt::NoDropShadowWindowHint

Но дальше обнаружился неприятный момент, если в macOS запустить это приложение и открыть Mission Control, то QDialog распознается им как окно и пользователь получает возможность им управлять. Привем в стандартных примерах есть widgets/widgets/windowflags (http://doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html), если там выставить флаг Qt::SplashScreen, то работает именно так, как нужно - в Mission Control окошко PreviewWindow скрывается.

Не могу понять в чем именно дело, сравнивал флаги в примере и моем приложении абсолютно одинаковые qDebug() << this->windowFlags()
Код:
QFlags<Qt::WindowType>(SplashScreen|WindowTitleHint|WindowSystemMenuHint|WindowMinMaxButtonsHint|WindowStaysOnTopHint|WindowCloseButtonHint|NoDropShadowWindowHint|WindowFullscreenButtonHint)
Думал, может быть это из-за того, что у меня QDialog, а в примере QWidget, попоробовал поменять и все равно не работает.

В чем может быть дело? Код абсолютно одинаковый, за исключением того, что в примере не использовался конструктор форм qtcreator:
Код:
Alert::Alert(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Alert)
{
    setAttribute(Qt::WA_TranslucentBackground);
    
    ui->setupUi(this);

    setWindowFlags(Qt::SplashScreen | Qt::WindowStaysOnTopHint | Qt::NoDropShadowWindowHint);
    qDebug() << this->windowFlags();
}
Из родительской формы вызывается так:
Код:
alert = new Alert();
alert->show();


Название: Re: Как спрятать окно от Mission Control (macOS)
Отправлено: kambala от Январь 15, 2017, 14:54
тоже не могу воспроизвести в widgets/widgets/windowflags, также пробовал менять на QDialog + загружать его из ui-файла и использовать твой код в конструкторе. Пробовал на 5.6 и 5.8, ос 10.11.

Выложи минимальный компилируемый пример с ошибкой.


Название: Re: Как спрятать окно от Mission Control (macOS)
Отправлено: posix от Январь 15, 2017, 15:48
Разобрался в чем было дело: ранее по совету wiki https://wiki.qt.io/MacOS_application_without_menu_bar, добавил в Info.plist
Код:
<key>LSUIElement</key>
<string>1</string>
для скрытия иконки приложения в доке и в системном меню. Стоило убрать и все заработало как надо, но вопрос остается открытым, как же все-таки одновременно и скрыть меню с иконкой и спрятать окно в Mission Control.


Название: Re: Как спрятать окно от Mission Control (macOS)
Отправлено: kambala от Январь 15, 2017, 16:38
я видел приложения, которые могут менять видимость иконки в доке и в менюбаре в рантайме — должна быть возможность реализовать это через нативный код.