Не изменяемый размер QDialog с фиксированным размером в Qt?

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

каково свойство, которое я должен установить, чтобы отключить изменение размера диалога / виджета.

Я тоже пробовал

setSizePolicy(QSizePolicy::Fixed);

, но я получаю сообщение об ошибке, говорящее..

sourcenimcac_settingsMain.cpp(36) : error C2248:
**'QSizePolicy::QSizePolicy' : cannot access private member declared in class 'QSizePolicy'**
        p:ThirdPartyExportsQtexport.3.3.1f14includeQtGui../../srcgui
kernelqsizepolicy.h(177) : see declaration of 'QSizePolicy::QSizePolicy'
        p:ThirdPartyExportsQtexport.3.3.1f14includeQtGui../../srcgui
kernelqsizepolicy.h(34) : see declaration of 'QSizePolicy'

просьба помочь мне с этим.

9 ответов


Я не знаю, если вы уже пробовали это, но QWidget::setFixedSize должны делать то, что вы хотите


ошибка компиляции вы получаете, потому что вы пытаетесь передать QSizePolicy::Policy to setSizePolicy(QSizePolicy), но нет неявного преобразования от QSizePolicy::Policy (что является политикой для одного измерения) до QSizePolicy (который является классом, содержащим, среди прочего, один Policy в размер (высота, ширина)). QSizePolicy все равно не работает на виджетах верхнего уровня (windows).

setFixedSize() работает только если вы знаете размер диалога заранее (и обычно вы этого не делаете, что с изменением размеров шрифта и языки.) Вы можете сделать

window()->setFixedSize( window()->sizeHint() );

но гораздо лучше использовать

window->layout()->setSizeConstraint( QLayout::SetFixedSize );

это позволяет макету определять размер диалога, но не позволяет изменять размер, что, я полагаю, является тем, что вы просили.


this->setFixedSize(this->width(),this->height());

вам нужно изменить windowFlags диалога и установить его в Qt:: MSWindowsFixedSizeDialogHint.

это работает только в Windows.

для получения дополнительной информации см. Этот пример: http://doc.qt.digia.com/4.5/widgets-windowflags.html


Если вы используете QtCreator (конечно, вы), вы можете установить свойство HorizontalsizePolicy в фиксированную и вертикальную политику также фиксированной. Затем вы можете установить maximumSize в нужные размеры. Окно не будет максимизировать снова.


в коде вы можете сделать что-то вроде этого,

Dialog->resize(581, 292);
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
sizePolicy.setHeightForWidth(WaterLevelEditorDialog->sizePolicy().hasHeightForWidth());
Dialog->setSizePolicy(sizePolicy);
Dialog->setMinimumSize(QSize(581, 292));
Dialog->setMaximumSize(QSize(581, 292));
Dialog->setSizeGripEnabled(false);

в QtCreator сделайте следующее,

  1. выберите виджет диалогового окна
  2. найдите виджет диалогового окна в окне объекта
  3. в окне объекта щелкните правой кнопкой мыши на объекте диалогового окна, чтобы открыть меню
  4. выберите "ограничения размера" - > "установить максимальный размер" из меню
  5. щелкните правой кнопкой мыши снова на объекте диалога, чтобы открыть меню
  6. Выберите "Размер" -> "Установить Минимальный Размер"
  7. В Окне Свойства,
    • убедитесь, что "sizePolicy" - >" горизонтальная политика "имеет значение"фиксированный"
    • убедитесь, что "sizePolicy" - >" вертикальная политика "имеет значение"фиксированный"
    • убедитесь, что "sizeGripEnabled" не проверено

в Qt Creator в Редакторе пользовательского интерфейса нажмите на верхний объект в окне свойств, затем прокрутите внизу в части макета. Вы должны увидеть layoutSizeConstraint свойство.

установить layoutSizeConstraint до SetFixedSize.


из документации Qt setSizePolicy() метод принимает нулевой аргумент или два аргумента, но не может быть одним аргументом. Вот почему вы получаете эту ошибку компиляции. Из моего эксперимента, если вы не установите фиксированный размер. Этот метод бесполезен. Окно все еще может быть изменено.


Если вы разрабатываете пользовательский интерфейс в QML и запускаете с помощью QDeclarativeView, попробуйте следующий код.

QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());
.
.
.
//To make the window non-resizable
viewer->setFixedSize(viewer->width(),viewer->height());

здесь QmlApplicationViewer является производным от QDeclarativeView.