Возможная ошибка Qt5: вызов setFixedSize () отключает кнопку закрытия главного окна (под Win7) - PullRequest
1 голос
/ 14 января 2020

Я публикую это в основном потому, что потратил немного времени на поиск решения, а также из любопытства.

В соответствии с популярным запросом, пошаговый воспроизводимый пример:

  1. создать проект виджета Qt из Qt designer.
    Оставить все параметры по умолчанию, кроме имени проекта (я назвал мой "bob").
    Установить цель сборки как MinGW X64

  2. скомпилируйте и запустите исполняемый файл с автоматически созданным скелетом кода по умолчанию (я сделал это в режиме отладки, но релиз тоже не работает).
    Убедитесь, что главное окно имеет изменяемый размер и кнопка закрытия в правом верхнем углу работает как положено.

  3. откройте файл "mainwindow. cpp" и добавьте вызов setFixedSize следующим образом:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        setFixedSize(geometry().size()); // <--- this line added
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
  4. Перекомпилируйте, перезапустите и убедитесь, что окно теперь отказывается изменять размер (как и должно быть), а кнопка закрытия больше не закрывает окно, но позволяет перетаскивать его, как если бы вы щелкнули заголовок вместо бара (который h это не должно).

В соответствии с более популярным запросом обоснование того, почему я считаю приведенное выше подробное руководство, является воспроизводимым примером проблемы

Minimal :

check

Минимальный и читаемый:

check

Убедитесь, что вся информация, необходимая для воспроизведения проблема включена в сам вопрос:

check

Используйте отдельные блоки кода для каждого включаемого вами файла или фрагмента. Предоставьте описание для каждого блока:

, если вы не хотите, чтобы я выгружал туда все файлы по умолчанию для проекта виджета Qt.

Опишите проблему :

сделано, дважды.

Используйте краткое, но описательное описание вашей проблемы в качестве заголовка вашего вопроса:

check

Устраните все проблемы, не относящиеся к проблеме:

изо всех сил, но, видимо, с ограниченным успехом

Перепроверьте что ваш пример воспроизводит проблему:

проверьте, обильно.

Это может помочь выключить систему и перезапустить ее, или перенести пример на fre sh среда, подтверждающая, что она действительно дает пример проблемы:

Ну, извините, ребята, но я не хочу переформатировать мой P C просто для того, чтобы, возможно, легко решить проблему с банально решена. В основном я публикую это из любопытства, а также вежливости по отношению к коллегам-программистам, которые могут столкнуться с той же проблемой, я считаю, что я уже достаточно сделал.

Итак, теперь для описания проблемы:

По-видимому, вызов setFixedSize(geometry().size()) в конструкторе главного окна стандартного приложения Qt Widgets (как рекомендовано в этой почтенной ветке форумов Qt ) имеет странный побочный эффект - отключение кнопки закрытия системы в моей системе Windows 7.

Как будто события щелчка просто провалились через кнопку, нажатие на нее просто захватит окно и позволит перетащить его, но не закроет.
За исключением этого, все работает как положено ( окно становится неизменяемым, ручка изменения размера в правом нижнем углу неактивна, вы все равно можете закрыть окно другими стандартными средствами, такими как Alt + F4 и т. д. c).

Работает (хотя и зависит от платформы c) способ сделать главное окно фиксированного размера состоит в том, чтобы вызывать
setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint);
перед настройкой пользовательского интерфейса (ui->setupUi(this);)

Тем не менее мне любопытно, что это удивительное поведение .
Есть ли очевидная причина, по которой изменение параметра поведения диспетчера компоновки может привести к путанице с системной кнопкой?
Я что-то здесь не так делаю?
Это воспроизводимая ошибка или странное последствие локальная проблема на моем P C - возможно, неправильная установка или конфигурация?

Я использую Qt Creator 4.11.0 на основе Qt 5.14. 0, с MinGW X64 в качестве цели на (французской) ОС Win7 (в тестовом режиме, по некоторым причинам, но я сомневаюсь, что ОС здесь виновата).

1 Ответ

1 голос
/ 16 января 2020

Согласно официальному трекеру ошибок https://bugreports.qt.io действительно есть ошибка, затрагивающая некоторые версии (вероятно, регрессия, введенная в Qt 5.12.5).

Пожалуйста, посмотрите:

https://bugreports.qt.io/browse/QTBUG-79922

и

https://bugreports.qt.io/browse/QTBUG-78262

и

https://bugreports.qt.io/browse/QTBUG-78656

Однако они сообщают, что проблема была исправлена ​​в Qt 5.14 и перенесена на Qt 5.13.2.

Вы используете скомпилированный Qt Creator с Qt 5.14 но мне неясно, компилируете ли вы также свое приложение для Qt 5.14 или другой версии. Версия, используемая для компиляции Qt Creator, и набор, который вы используете для своего кода, очевидно, две разные вещи. Поэтому я бы посоветовал проверить, действительно ли вы компилируете свое приложение с версией, которая должна иметь исправление, и если да, сообщите об этой проблеме в bugreports.qt.io

Поскольку это ошибка Qt, есть не так много мы можем сделать здесь ...

...