Не изменяемый размер 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 64

9 ответов:

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

ошибка компиляции вы получаете, потому что вы пытаетесь передать QSizePolicy::Policy до 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 фиксированной и вертикальной политики также фиксированной. Затем вы можете установить максимальный размер в нужные вам размеры. Окно не будет максимизировать снова.

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

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.