Как удалить кнопку максимизации в окне инструментов Mac OS X в Qt - PullRequest
5 голосов
/ 13 января 2010

У меня есть плавающее окно инструмента. На Windows работает нормально, но не получается избавиться от кнопки максимизации в Mac OS X. Я попытался сбросить Qt::WindowMaximizeButtonHint и установка окна в фиксированный размер. Кажется, ничего не работает.

MyWidget::MyWidget( QWidget* parent )
:QWidget( parent, Qt::Tool | Qt::CustomizeWindowHint )
{
   setupUi( this );

   setFixedSize( sizeHint() ); // doesn't remove maximise button
   setWindowFlags( windowFlags() & ~Qt::WindowMaximizeButtonHint ); // doesn't remove maximise button
}

Я не хочу использовать безрамное окно. Есть идеи? Я использую Qt 4.4.

Ответы [ 5 ]

10 голосов
/ 14 января 2010

Запустить пример приложения Qt windowflags. Выберите радиокнопку Tool и проверьте:

  • Заголовок окна
  • Настроить окно
  • Кнопка закрытия окна

Это единственный способ, который я нашел в Mac OS X для достижения того, чего вы хотите, НО вы потеряете кнопку сворачивания. Другого пути нет. Это ограничение Mac OS X Window Manager.

Подводя итог, в строке заголовка есть только пять наборов кнопок:

  1. Все кнопки видны и все кнопки включены: setWindowFlags(Qt::Tool)
  2. Все кнопки видны, кнопки закрытия и максимизации включены, кнопка минимизации отключена: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
  3. Все кнопки видны, кнопка максимизации включена, закрытие и минимизация отключены: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint | Qt::CustomizeWindowHint)
  4. Видна и включена только кнопка закрытия setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
  5. Нет кнопок в строке заголовка: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
4 голосов
/ 15 января 2010

Этот код от Ричарда Густавсена из Nokia работает в Qt 4.4:

class MyWidget : public QWidget
{
    public:

    MyWidget::MyWidget( QWidget* parent ) : QWidget(parent, Qt::Tool)
    {
    }

    void setVisible(bool visible)
    {
        QWidget::setVisible(visible);
        ChangeWindowAttributes(qt_mac_window_for(this), kWindowNoAttributes, kWindowFullZoomAttribute);
    }
};

Спасибо, Ричард и Нокиа!

3 голосов
/ 14 января 2010

Вы можете попробовать установить флаг окна, включающий Qt::Dialog (жирный шрифт добавлен):

Указывает, что виджет является окном, которое должно быть оформлено как диалог (т. Е. обычно не имеет кнопок максимизации или минимизации в строке заголовка ). Это тип по умолчанию для QDialog. Если вы хотите использовать его в качестве модального диалога, он должен быть запущен из другого окна или иметь родительский элемент и использоваться со свойством QWidget :: windowModality. Если вы сделаете его модальным, диалоговое окно будет препятствовать тому, чтобы другие окна верхнего уровня в приложении получали какой-либо ввод. Мы ссылаемся на окно верхнего уровня, родительский элемент которого является вторичным окном.

Я не знаю, что произойдет, если вы попытаетесь установить и Qt::Dialog, и Qt::Tool, но, возможно, стоит попробовать.

2 голосов
/ 23 января 2012

Вот кроссплатформенный способ сделать это. Вы переопределили ваш метод setVisible вашего QMainWindow или QWidget. Таким же образом можно изменить любой флаг окна, который оказывает визуальное влияние на окно.

Причина, по которой это должно быть сделано таким образом, заключается в том, что класс должен иметь спецификации окна, прежде чем он действительно покажет окно.

void setVisible(bool visible)
{
    setWindowFlags( windowFlags() & ~Qt::WindowMaximizeButtonHint );
    QWidget::setVisible(visible);
}
1 голос
/ 19 февраля 2010

Я смог сделать это с

setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...