ChatGPT解决这个技术问题 Extra ChatGPT

Qt中固定大小的不可调整大小的QDialog?

我有一个 Qt 对话框应用程序。现在我不希望该对话框可调整大小。我不确定如何实现这一目标。我尝试了很多东西,但是当对话框启动时,这个对话框仍然可以调整大小。

我应该设置什么属性来禁用对话框/小部件调整大小。

我也试过

setSizePolicy(QSizePolicy::Fixed);

但我得到一个错误说..

source\nimcac_settingsMain.cpp(36) : error C2248:
**'QSizePolicy::QSizePolicy' : cannot access private member declared in class 'QSizePolicy'**
        p:\ThirdPartyExports\Qt\export\4.3\4.3.1f14\include\QtGui\../../src\gui\
kernel\qsizepolicy.h(177) : see declaration of 'QSizePolicy::QSizePolicy'
        p:\ThirdPartyExports\Qt\export\4.3\4.3.1f14\include\QtGui\../../src\gui\
kernel\qsizepolicy.h(34) : see declaration of 'QSizePolicy'

请帮我解决这个问题。


S
Steve Lorimer

您得到的编译错误是因为您尝试将 QSizePolicy::Policy 传递给 setSizePolicy(QSizePolicy),但没有从 QSizePolicy::Policy(这是一维的策略)到 QSizePolicy(这是一个包含的类,其中其他东西,每个维度(高度、宽度)一个 Policy)。但是,QSizePolicy 无论如何都不适用于顶级小部件(窗口)。

setFixedSize() 仅在您事先知道对话框的大小时才有效(通常您不知道,更改字体大小和语言会怎样)。你可以做

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

但使用起来要好得多

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

这让布局确定对话框的大小,但不允许调整大小,我认为这是您所要求的。


window->layout()->setSizeConstraint( QLayout::SetFixedSize ); 几乎是我所需要的,因为它会随着字体等的变化而更新。但我只想修复高度而不是宽度。这可能吗?
你是MVP。这使得我的 QDialog 不能由用户调整大小,但它仍然会在其内容更改大小时调整大小。
t
tro

我不知道您是否已经尝试过,但 QWidget::setFixedSize 应该做您想做的事


在我看来,虽然这避免了调整大小,但您必须事先知道窗口尺寸(这并不总是服从字体更改、屏幕缩放等)。
o
ollo
this->setFixedSize(this->width(),this->height());

或者干脆this->setFixedSize(this->size());
或者更简单:) setFixedSize(size());
m
mavroprovato

您需要更改对话框的 windowFlags 并将其设置为 Qt::MSWindowsFixedSizeDialogHint。

这仅适用于 Windows。

有关详细信息,请参阅此示例:http://doc.qt.digia.com/4.5/widgets-windowflags.html


当存在便携式解决方案时,请不要提供特定于 Windows 的解决方案......
j
jlguenego

在 QT Creator 的 UI 编辑器中,单击属性窗口中的顶部对象,然后在 Layout 部分的底部滚动。您应该看到 layoutSizeConstraint 属性。

layoutSizeConstraint 设置为 SetFixedSize


M
Mario S

如果您使用 QtCreator(当然是),您可以将属性 HorizontalsizePolicy 设置为 fixed,并将 Vertical Policy 也设置为 Fixed。然后您可以将 maximumSize 设置为您想要的尺寸。窗口不会再次最大化。


s
shrikantd

在代码中你可以做这样的事情,

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 中执行以下操作,

选择对话框小部件 在对象窗口中找到对话框小部件 在对象窗口中,右键单击对话框对象以弹出菜单 从菜单中选择“Size Constraints”->“Set Maximum Size” 再次右键单击对话框对象以弹出菜单a menu Select "Size Constraints" -> "Set Minimum Size" 在属性窗口中,确保 "sizePolicy"->"Horizontal Policy" 的值为 "Fixed" 确保 "sizePolicy"->"Vertical Policy" 的值为 "Fixed" 确保 " sizeGripEnabled" 未选中


o
ollo

在 Qt 文档中,setSizePolicy() 方法采用零参数或两个参数,但不能是一个参数。这就是您收到此编译错误的原因。根据我的实验,如果您不设置固定大小。这种方法没有用。窗口仍然可以调整大小。


P
Patitotective

一种更简单的方法是将最大尺寸设置为 0。

this->setMaxiumSize(QSize(0, 0));

o
ollo

如果您在 QML 中设计 UI 并使用 QDeclarativeView 启动,请尝试以下代码。

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

这里的 QmlApplicationViewer 是从 QDeclarativeView 派生的。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅