Строка заголовка дочернего QMainWindow исчезла в Mac OS X (добавить описание)

Я разрабатываю программу для Mac OS X, используя Qt 4.8 в качестве названия. Теперь я столкнулся с проблемой, на которую я потратил много времени, но до сих пор не могу решить.

У меня есть QWidget (называемый A), который откроет QMainWindow (называемый B) после некоторой операции. Когда B открыт, мне нужно, чтобы A был заблокирован B, поэтому я устанавливаю A как родителя B и устанавливаю модальность окна B в Qt::WindowModal.

На другой платформе это работает так, как я думал, однако, когда дело доходит до Mac, у B нет собственной строки заголовка, она просто всплывает и прикрепляется к строке заголовка A. А также кнопка закрытия на строка заголовка A неактивна, что означает, что я не могу закрыть B с помощью кнопки, мне нужно использовать выход QAction в QMenu, чтобы закрыть его.

Когда я устанавливаю для родителя B значение 0 (NULL) вместо B, тогда у него будет независимая строка заголовка, как в Windows или Linux, это то, что я хочу. Однако он потерял свойство, которое B заблокировал A.

Я пытался установить флаги Windows, такие как Qt::CustomizeWindowHint и т. д., но ничего не работает.

Есть ли способ сохранить иерархические отношения между A и B и дать B независимую строку заголовка на Mac? Спасибо всем за помощь :)

пс. Я попробовал небольшую программу и обнаружил, что эта ситуация происходит только в WindowModal (NonModal и ApplicationModal работают нормально)


person Claire Huang    schedule 26.04.2012    source источник


Ответы (1)


Описываемое вами поведение известно как листы в Mac OS X. Как вы подозревали, существует значение для перечисления флагов окна, которое указывает, должно ли окно быть листом. Судя по документации, вызов setWindowModality() в OS X по умолчанию окно может быть листом - - это, вероятно, то, что большинство разработчиков хотели бы для большинства диалогов. Вы можете попробовать протестировать и явно удалить этот флаг после установки модальности и посмотреть, поможет ли это. В качестве альтернативы вы можете проверить, какие флаги установлены, и посмотреть, приведет ли это к решению.

person Caleb Huitt - cjhuitt    schedule 26.04.2012
comment
Спасибо Калеб! Я сгенерировал QMainWindow и установил для него значение WindowModal с помощью Qt Creator, он вызывает функцию setWindowModality в сгенерированном файле ui_mainwindow. Сначала я не ставил никакого флага, потом попробовал Qt::Window, но ситуация та же. Файл пользовательского интерфейса также не устанавливал никаких флагов по умолчанию. Как я добавил в описании, это происходит только в windowModal. NonModal и ApplicationModal в порядке. Это связано? Все, что я могу найти в Google, это флаги окон, которые я уже сделал. Я прочитал документ, Qt::Window не включает свойство листа. Почему он по-прежнему ведет себя как лист, а не как обычное окно? - person Claire Huang; 26.04.2012