Реклама
  • 11 августа 2017 г. 17:56

Переключение между Qt::WindowMaximized и Qt::WindowNoState при фиксированном размере окна.

Добрый день, EVILEG. Вот, заканчивая рабочий день, решил задать вопрос, ответ на который я искал весь день и не нашел.
Мне нужно, чтобы окно приложения могло иметь всего два состояния.
1. Qt::WindowNoState без возможности изменять размер окна.
2. Qt::WindowMaximized.

Но при фиксированном размере окна  или при флаге окна  Qt::MSWindowsFixedSizeDialogHint кнопка "максимизировать" сверху справа  недоступна. Есть ли возможность сделать ее доступной? И нажатие на нее связать со своим слотом, так как события нажатия на эту кнопку я не нашел?
Или только как выход, создать кнопку QPushButton и ее клик связать со своим слотом? Но это, по-моему, ужасно - использовать этот велосипед вместо предназначенной для этого кнопки "максимизировать".

Что можете посоветовать и подсказать по моей данной проблеме, EVILEG? :)

noState-min.png
  • #
  • 12 августа 2017 г. 1:19

Добрый день! А вы пробовали вместе с флагом  Qt::MSWindowsFixedSizeDialogHint поднять сразу флаг Qt::WindowMaximizeButtonHint? Там же одновременно можно поднимать флаги.

Увы, так это не работает.   У Qt есть пример windowflags. Но ни одна комбинация флагов не дает нужного эффекта.
Есть какие либо  другие идеи  заставить приложение не изменять размеры окна, но быть способным максимизироваться ?

noMaximized-min.png

Сделал то, что нужно.
Похоже на баг Qt:
Если setFixedSize вызвать в конструкторе класса MainWindow, то кнопка максимизировать будет недоступна.
Но если это сделать через какое-то время, то размер так же станет фиксированным, но кнопка максимизировать будет доступна.
Случайно заметил это. Это и стало решением.

Оу. Я немного отвлёкся на работе вчера, не глянул эту проблему.

Ясно. Интересный момент, конечно. Да, вполне возможно, что это баг.
Хотя я вот думаю, что фиксированный размер должен подразумевать фиксацию, без возможности максимизации, так что вполне может оказаться, что ваше решение это скорее хак через дыру.

Можно, конечно сделать своё собственное оформление окна с учётом макисимизации, но по мне так, овчинка выделки не стоит.

  • EVILEG
  • #
  • отредактировано 15 августа 2017 г. 17:10
  • 15 августа 2017 г. 17:02

По-моему, я написал велосипед.
Но по другому я не знаю как сделать :)

    if(event->type() == QEvent::WindowStateChange)
    {
        if(windowState() == Qt::WindowMaximized)
        {
            QScreen *screen = QApplication::primaryScreen();
            setFixedSize(screen->availableSize().width(), screen->availableSize().height()-27);
            resize(minimumSize());
        }
        else if(windowState() == Qt::WindowMinimized)
        {
        }
        else if(windowState() == Qt::WindowNoState)
        {
            setFixedSize(800, 600);
            resize(minimumSize());
        }
    }
screen->availableSize() возвращает разрешение экрана, оставляя место для панели задач (пуск). 
Там я вычитаю число 27 от высоты. Что это за число я не понял, догадываюсь, что это рамка или что-то такое.
Если не вычитать, то qDebug() мне выдает следущее сообщение:

setGeometry: Unable to set geometry 1600x852+0+27 on QWidgetWindow/'MainWindowWindow'. Resulting geometry: 1600x825+0+27 (frame: 9, 36, 9, 9, custom margin: 0, 0, 0, 0, minimum size: 1600x852, maximum size: 1600x852).

Не знаешь что это именно  за число такое, а то я не нашел метода, возвращающее это число? :)

Согласен - это велосипед, но это гораздо меньше, чем отключить оформление окна и написать своё оформление ))
Например, как здесь .

Реклама

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
  • leha
  • 20 октября 2017 г. 11:38

Qt - Тест 001. Сигналы и слоты

  • Результат 63 баллов
  • Очки рейтинга -1
  • faust
  • 19 октября 2017 г. 18:53

C++ - Тест 005. Структуры и Классы

  • Результат 100 баллов
  • Очки рейтинга 10
  • faust
  • 19 октября 2017 г. 15:49

C++ - Тест 002. Константы

  • Результат 91 баллов
  • Очки рейтинга 8
Последние комментарии
  • EVILEG
  • 21 октября 2017 г. 3:06

Qt/C++ - Урок 031. QCustomPlot - строим график по времени

Добавил архив с проектом

  • EVILEG
  • 20 октября 2017 г. 20:06

Qt/C++ - Урок 031. QCustomPlot - строим график по времени

После работы поищу, должен где-то быть на винте.

  • Миша
  • 20 октября 2017 г. 20:04

Qt/C++ - Урок 031. QCustomPlot - строим график по времени

не могли бы вы выложить архив с рабочей версией скрипта?

  • EVILEG
  • 20 октября 2017 г. 20:03

Qt/C++ - Урок 030. QCustomPlot - быстрый старт в работе с графиками

Использование дизайнера в Qt Creator и использование ui файлов является распространённой практикой в Qt фреймворке. Написать отдельную статью про то, что это такое? - может быть. Опи...

  • Миша
  • 20 октября 2017 г. 19:43

Qt/C++ - Урок 030. QCustomPlot - быстрый старт в работе с графиками

Но почему вы это не описали? Не могли бы вы описать.

Сейчас обсуждают на форуме
  • cordsac
  • 19 октября 2017 г. 15:49

How can I select the QGraphicView Item and change the properties

Ok I'll check it sir,If you can please do article(tutorial) about this,Its really useful.Thank you if you can give me some sample code when you free.thanks again

  • cordsac
  • 17 октября 2017 г. 19:28

How can I open SVG file through QT

Okay,Thank you sir :)

  • EVILEG
  • 16 октября 2017 г. 20:34

Qt, Загрузка изображения в QImage

Сам view нужно поместить в внутри окна, а не просто создать его. Можете создать в графическом редакторе Qt Creator`а окно, набросать там QGraphicsView и потом посмотреть в сгенерированном...

  • mihenze
  • 15 октября 2017 г. 21:30

Рисуем линию QGraphicsItem за мышью

Большое спасибо!

  • EVILEG
  • 15 октября 2017 г. 18:58

Описание класса С++ в QtCreator

Для начала добавьте недостающие методы и участники для Q_PROPERTY. Для этого вызовите контекстное меню через ПКМ у Q_PROPERTY, там будет пункт "добавить недостающие члены". Автоматически...