当鼠标悬停在边框上时,如何完全禁用调整窗口大小,包括调整大小图标?
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::Widget
、Qt::Window
或Qt::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,我不得不同时使用这个答案和下一个(windowFlagQt::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,您可以尝试在geometry
、minimumSize
和@的properties
中指定相同的窗口Width
和Height
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->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);
【讨论】:
以上是关于当鼠标悬停在边框上时,如何完全禁用调整窗口大小,包括调整大小图标?的主要内容,如果未能解决你的问题,请参考以下文章