Проблема изменения размера окна Qt - PullRequest
7 голосов
/ 01 июля 2011

У меня проблема с перерисовкой окна QWidget после настройки его размера. Я пробовал update(), repaint(), adjustSize(), но все, похоже, страдают от одного и того же: перерисовывается только часть окна, в результате чего оконная рама на нижней и правой сторонах не отображается. Размер окна также не изменяется полностью.

На случай, если что-то изменится, окно будет QMdiArea.

Спасибо.

        //  ... some subwidget resizing and moving.
        calibrationWindowUIs[activeWindow].layoutWidget2->move(QPoint(oldXLeft, 30 + height + 21));
        calibrationWindowUIs[activeWindow].layoutWidget1->move(QPoint(oldXRight, 30 + height + 21));

        //  Set window size.
        calibrationWindows[activeWindow]->setMinimumSize(calibrationWindowUIs[activeWindow].tabWidget->geometry().width() + 40, calibrationWindowUIs[activeWindow].tabWidget->geometry().height() + 40);
        calibrationWindows[activeWindow]->update();

Примечание: я новичок в Qt; возможно я что-то не так делаю с макетами?

Редактировать: Возможно, я не дал достаточно информации. Хорошо, честно говоря, я все еще должен углубиться в макеты и связанный материал. Здесь я попытался использовать Qt Designer для оформления окна. Я сделал то, что, возможно, является глупой ошибкой: я не использовал общий родительский макет для всего окна, но взломал его с помощью пары небольших макетов, которые мне, следовательно, нужно перемещать и изменять размеры по отдельности. Смотрите экран Qt Designer (красные прямоугольники - единственные макеты): calibrationWindow.

Что происходит, так это то, что в кадре справа я играю видеоклип, который может иметь различное разрешение. Я хочу, чтобы размер рамки изменялся в зависимости от этого разрешения, что также означает, что кнопки и окно должны соответственно перемещаться / изменяться. Вот тут-то и происходит изменение размера окна. Я уверен, что есть более элегантное решение, чем то, что я делаю здесь, но я пытаюсь справиться с несколькими другими сценариями здесь и, следовательно, с некачественным кодом.

В результате, когда я загружаю клип, окно пытается изменить размер, но делает это плохо; следующий результат: calibrationWindowB

Если окно перетаскивается, оно «всплывает» в правильном размере; в то же время, тем не менее, это выглядит ужасно.

Еще пара вопросов: используете ли вы Qt Designer для разработки своих пользовательских интерфейсов? Я обнаружил, что программно вы можете добиться гораздо лучшего контроля над вашими интерфейсами. Одна вещь, которую я не мог сделать в конструкторе, это иметь компоновку, размеченную основным виджетом, то есть эквивалент наличия следующего бита кода:

QVBoxLayout* layout = new QVBoxLayout;
this->setLayout(layout);

Макет, размещенный в конструкторе, всегда создает этот подвиджет layoutWidget, для которого вы разместили макет , а затем . Любой способ обойти это?

Ответы [ 2 ]

6 голосов
/ 03 июля 2011

Мы используем сочетание конструктора и кода для создания макетов, иногда система макетов Qt может быть очень неинтуитивной.Но я бы, вероятно, , а не разместил бы полную серию вкладок в одном файле пользовательского интерфейса дизайнера, я бы сделал каждую вкладку для каждого отдельного виджета, а затем собрал их либо с помощью кода, либо в дизайнере, повысив класс до пользовательских.Это дает вам лучшее разделение обязанностей: объединяя все функции всех вкладок в одном файле, вы почти гарантируете большой громоздкий класс.

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

Что помогает, так это создание иерархий макетов.Глядя на ваш первый скриншот, я бы, вероятно, использовал вертикальную компоновку с проставками сверху и снизу для элементов справа, горизонтальную компоновку с проставками слева и справа для панели кнопок и компоновку сетки для всех элементов вместе.Без проставок ваши предметы будут расширяться при увеличении окна.Распорки позволят вам лучше контролировать поведение при изменении размера.

0 голосов
/ 03 июля 2011

вы звоните setMinimumSize(). Это хорошо, но вы также должны позвонить resize()

...