如何完全禁用窗口大小调整功能,包括当鼠标悬停在边框上时的调整图标?

58

我使用了以下代码:

setFixedSize(size());

来防止窗口调整大小,但是当鼠标在窗口边框上悬停时,调整大小箭头仍然会出现。

有没有更好的方法禁用窗口调整大小以避免显示穿过边框的箭头?


你使用的是哪个操作系统?你试过使用对话框代替窗口吗? - Amartel
Windows 8. 开发桌面应用。我刚创建了一个新项目。你认为对话框会是个问题吗? - Klasik
我会尝试使用对话框。 - Klasik
请问您能否对答案进行评论,并说明如何使其工作?我现在遇到了相同的问题,但是对象参数从未是QSizeGrip,因此我不知道接下来该怎么做。 - Alec Mev
4
setFixedSize(size()) 对我起作用了。也许这是一个旧的Qt bug,或者在您调用之后有其他东西覆盖了它。 - AsksAnyway
显示剩余4条评论
15个回答

59

Qt有一个名为Qt::MSWindowsFixedSizeDialogHint的窗口标志。根据您的具体需求,您需要将此标志与Qt::WidgetQt::WindowQt::Dialog结合使用。

void MyDialog::MyDialog()
{
  setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);

  ...
}

@dsonck92:我尝试了这个方法,它可以正常工作,但是对于我想要实现的目标,仍然存在一个问题。目标:最大化+不可调整大小的窗口。结果:窗口显示为最大化,并且边框手柄和最大化按钮被禁用,到目前为止很好。问题:我仍然可以将其从屏幕顶部“拉”出来,当我这样做时,它会恢复到其默认大小(默认大小是指QtCreator的全新应用程序窗口大小),顺便说一下,我无法再次最大化它,显然,即使将其“扔”回屏幕顶部,也不行,请问有什么见解...谢谢。使用基于qt 5.2.0的qtcreator 3.0.0。 - Scaramouche
这是我找到的唯一适用于Windows 7和10的方法。 - dan_g
1
这个Python代码对我有用,谢谢!self.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.MSWindowsFixedSizeDialogHint | QtCore.Qt.WindowMinimizeButtonHint) - Adam Sirrelle
禁用垂直和双向手柄,但保留水平手柄怎么样? - z33k
如果停靠窗口部件被分离,它就无法工作。 - LRDPRDX

27

如果您确切地知道所需窗口的大小,则可以使用一行代码:

this->setFixedSize(QSize(750, 400));

2
像魔法一样运作! - fmc
如果停靠窗口部件被分离,它就无法工作。 - LRDPRDX

19

尝试像这样:

this->statusBar()->setSizeGripEnabled(false);

如果这不能起作用,您只需检测哪个窗口小部件正在启用QSizeGrip, 您可以在应用程序上安装事件过滤器并尝试捕获QSizeGrip的mouseMoveEvent来实现此目的。然后调试其父小部件。
以下是可以使用的eventFilter函数示例:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::MouseMove)
    {
        QSizeGrip *sg = qobject_cast<QSizeGrip*>(obj);
        if(sg)
            qDebug() << sg->parentWidget();
    }
    return false;
}

你也可以捕获它的展示事件,这取决于你。


2
在使用Windows 10时,我不得不同时使用这个答案和下一个(windowFlag Qt::MSWindowsFixedSizeDialogHint)。 - ForeverLearning

12
如果使用Qt Designer,则应将窗口的"sizePolicy"属性在垂直和水平方向上设置为"Fixed",并将最小和最大尺寸设置为相等的值。 然后,在窗口上右键单击并选择"Remove Status Bar"以消除右下角的"size grip"。或者,仅通过francis的建议删除大小调整手柄(而不是整个状态栏)。

值得注意的是,然后您需要将最小/最大尺寸设置为相等,并且与您的编辑器窗口大小相同。这将禁用调整大小。 - Aleksandr Hovhannisyan

12

我发现在布局上调用setSizeConstraint(QLayout::SetFixedSize) 对我来说效果最好。具体来说,从QMainWindow构造函数中,我调用了:

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

这里有一个链接到文档:http://doc.qt.io/qt-4.8/qlayout.html#SizeConstraint-enum

(我正在使用Qt 4.8。)

既然这也是解决OP问题的简单方法,我想分享给其他人考虑。似乎在Qt中有许多方法可以完成这个任务,但并非所有方法都适用于每种情况。 我尝试了这里发布的其他选项,但它们在我的情况下都存在各种问题或限制。


2
如果您正在以编程方式添加小部件并且在构造后不知道其大小,则最佳解决方案。 - melMass
关于dock widget的一点说明(已测试Qt 5.9.7)。如果您在包含dock widget的窗口(在我的情况下是QMainWindow)上设置此约束,则行为如下:如果您通过双击将dock分离,一切都很好,但是如果您用鼠标拖动dock widget,则主窗口不会调整大小,但内部小部件会。因此,“解决方案”是将以下功能添加到我的dock widgets中:setFeatures(QDockWidget::DockWidgetClosable | QDockWidgetFloatable)。这样,您就无法使用鼠标拖动dock,但仍然可以将其分离。不知道是否会产生问题。 - LRDPRDX

5

使用

setMinimumSize(QSize(宽度_像素,高度_像素))

setMaximumSize(QSize(宽度_像素,高度_像素))

两种方法具有相同的大小。您将看不到调整大小的光标,窗口也不会被调整大小/最大化。


5
如果您希望从UI表单本身获取宽度和高度的值而无需手动指定,则可以在您的项目类中添加以下命令:
this->setFixedSize(this->width(), this->height());

如果需要,您还可以使用以下方法为宽度和高度设置单独的参数:

this->setFixedWidth(this->width());
this->setFixedHeight(this->height());

3
您可以像这样执行操作:
this->setFixedWidth(int);
this->setFixedHeight(int);

箭头也消失了。

3
如果您使用Qt Creator,可以尝试在geometryminimumSizemaximumSizeproperties中指定相同的窗口WidthHeight。请保留HTML标签。

3
你可以在Qt5中使用以下代码
this->setMinimumSize(sz);
this->setMaximumSize(sz);

这里的sz是一个QSize对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接