Russian Qt Forum
Апрель 20, 2024, 13:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как спрятать окно от Mission Control (macOS)  (Прочитано 3227 раз)
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();
« Последнее редактирование: Январь 15, 2017, 08:40 от posix » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Январь 15, 2017, 14:54 »

тоже не могу воспроизвести в widgets/widgets/windowflags, также пробовал менять на QDialog + загружать его из ui-файла и использовать твой код в конструкторе. Пробовал на 5.6 и 5.8, ос 10.11.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
posix
Гость
« Ответ #2 : Январь 15, 2017, 15:48 »

Разобрался в чем было дело: ранее по совету wiki https://wiki.qt.io/MacOS_application_without_menu_bar, добавил в Info.plist
Код:
<key>LSUIElement</key>
<string>1</string>
для скрытия иконки приложения в доке и в системном меню. Стоило убрать и все заработало как надо, но вопрос остается открытым, как же все-таки одновременно и скрыть меню с иконкой и спрятать окно в Mission Control.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Январь 15, 2017, 16:38 »

я видел приложения, которые могут менять видимость иконки в доке и в менюбаре в рантайме — должна быть возможность реализовать это через нативный код.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.