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

Posted

技术标签:

【中文标题】当鼠标悬停在边框上时,如何完全禁用调整窗口大小,包括调整大小图标?【英文标题】:how can I fully disable resizing a window including the resize icon when the mouse hovers the border? 【发布时间】:2013-05-16 09:38:05 【问题描述】:

我用过: setFixedSize(size()); 停止调整窗口大小,但当鼠标移到窗口边框上时,调整大小箭头仍然出现。

有没有更好的方法来禁用窗口大小调整以避免在越界时显示箭头?

【问题讨论】:

您使用的是什么操作系统?你试过用对话框代替窗口吗? Windows 8. 为桌面开发。我刚刚创建了新项目。你认为对话会是问题吗? 嗯,在我的 WinXp 中,唯一出现箭头的地方(设置固定大小后)是右下角(带有三角形的那个)。在对话框中(设置固定大小后) - 没有出现箭头。 我会尝试使用对话框。 setFixedSize(size()) 对我有用。也许这是一个旧的 Qt 错误,或者在你调用之后有其他东西覆盖了你的调用。 【参考方案1】:

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

void MyDialog::MyDialog()

  setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);

  ...

【讨论】:

效果很好!谢谢你,我想知道为什么没有人投票给你。 @dsonck92:我试过这个,它工作得很好,但我想要实现的目标仍然有一个泄漏。目标:最大化 + 不可调整的窗口。结果:窗口显示最大化,并且禁用了边框和最大化按钮,到目前为止很好。泄漏:我仍然可以将它“拉”离屏幕顶部,当我这样做时,它会恢复到其默认大小(默认为 QtCreator 的全新应用程序窗口大小),顺便说一句,我无法再次最大化,显然,甚至不会将其“扔”回屏幕顶部,请提供任何见解..thanx。使用基于 qt 5.2.0 的 qtcreator 3.0.0 这是我发现的唯一适用于 Windows 7 和 10 的版本 这在 Python 中对我有用,谢谢! self.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.MSWindowsFixedSizeDialogHint | QtCore.Qt.WindowMinimizeButtonHint) 如果只禁用垂直和二维夹点但启用水平夹点会怎样?【参考方案2】:

如果您确切知道所需的窗口大小,则为单线:

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

【讨论】:

像魅力一样工作! 如果停靠小部件分离则不起作用。【参考方案3】:

试试这样的:

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;

你也可以赶上它的表演活动,这取决于你。

【讨论】:

使用 windows 10,我不得不同时使用这个答案和下一个(windowFlag Qt::MSWindowsFixedSizeDialogHint【参考方案4】:

如果使用 Qt Designer,请将窗口的“sizePolicy”属性在垂直和水平方向上设置为“Fixed”,并将最小和最大尺寸设置为相等的值。然后,右键单击窗口并选择“删除状态栏”以摆脱右下角的“尺寸夹点”。或者,通过 francis 的建议(而不是整个状态栏)仅删除尺寸夹点。

【讨论】:

值得注意的是,您需要将最小/最大尺寸设置为与编辑器中的窗口大小相等。这将禁用调整大小。【参考方案5】:

我发现在布局上调用 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 中似乎有很多方法可以实现这一点,但并非所有方法都适合每种情况。我尝试了此处发布的其他几个选项,但它们存在各种问题或限制,我对自己的情况并不满意。

【讨论】:

如果您以编程方式添加小部件并且不知道构造后的大小,则为最佳解决方案。 只是关于停靠小部件的注释(Qt 5.9.7 测试)。如果您在包含停靠小部件的窗口(在我的情况下为QMainWindow)上设置此约束,则行为如下:如果您通过双击它来分离停靠,一切都很好,但是如果您使用您的拖动停靠小部件鼠标主窗口不会调整大小,但里面的小部件会。所以我发现的“解决方案”是在我的停靠小部件中添加以下功能:setFeatures( QDockWidget::DockWidgetClosable | QDockWidgetFloatable )。因此,您不能用鼠标拖动扩展坞,但仍然可以将其分离。不知道会不会产生问题。【参考方案6】:

使用

setMinimumSize(QSize(width_px,height_px))

setMaximumSize(QSize(width_px,height_px))

两种方法的尺寸都相同。您不会看到调整大小的光标,因此窗口不会调整大小/最大化。

【讨论】:

【参考方案7】:

如果您希望在不手动指定的情况下从 UI 表单本身获取宽度和高度的值,那么您可以在项目类中添加以下命令:

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

您还可以通过以下方式为宽度和高度(如果需要)设置单独的参数:

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

【讨论】:

【参考方案8】:

这对我使用 Qt Creator 3.1.1 有所帮助:

this->setFixedSize(this->maximumSize());

【讨论】:

在 Qt 5.9.7 中根本不起作用【参考方案9】:

如果您使用Qt Creator,您可以尝试geometryminimumSize和@的properties中指定相同的窗口WidthHeight 987654327@.

【讨论】:

【参考方案10】:

您可以在 Qt5 中使用以下代码

this->setMinimumSize(sz);
this->setMaximumSize(sz);

其中 sz 是 QSize 对象。

【讨论】:

【参考方案11】:

你也可以这样做:

this->setFixedWidth(int);
this->setFixedHeight(int);

箭也不见了。

【讨论】:

【参考方案12】:

如果有人在寻找相同的内容,但在 Python 中:

    MainWindow.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint)

【讨论】:

这将覆盖 所有 其他标志以设置此标志。如果您希望单独设置此标志,setWindowFlag(QtCore.Qt.MSWindowsFixedSizeDialogHint, True) 可能是更好的选择。【参考方案13】:

要防止调整窗口大小,请添加以下行:

setFixedSize(width(), height());

在你的 QMainWindow 构造函数之后的行:ui-&gt;setupUi(this);.

【讨论】:

【参考方案14】:

在 Windows 10 上真正适合我的唯一解决方案是使用 WinAPI:

#ifdef Q_OS_WIN
    #include <windows.h>

    ...

    SetWindowLong((HWND) window->winId(), GWL_STYLE, GetWindowLong((HWND) window->winId(), GWL_STYLE)&~WS_SIZEBOX);

#endif

【讨论】:

【参考方案15】:

尺寸在外观之前是未知的,并且也会因系统设置而异(100%、125%、150%),因此您可以尝试这样的操作(它也隐藏了调整大小光标):

void QWidget::showEvent(QShowEvent *event)

    // disable vertical resize
    int height = this->height();
    if (height != minimumHeight() || height != maximumHeight()) 
        setMinimumHeight(height);
        setMaximumHeight(height);
    

【讨论】:

以上是关于当鼠标悬停在边框上时,如何完全禁用调整窗口大小,包括调整大小图标?的主要内容,如果未能解决你的问题,请参考以下文章

当鼠标悬停在绝对div上时,jQuery禁用滚动

角落里的点如何被称为以及如何禁用它们

R情节,当鼠标悬停在图上时正常光标

如何将弹出窗口添加到折线中,当鼠标悬停在地图上的折线上时显示传单

调整框架(窗口)大小后组件消失

html表格如何通过更改悬停边框来突出显示列?