如何在 Qt 的 Mac OS X 工具窗口中删除最大化按钮
Posted
技术标签:
【中文标题】如何在 Qt 的 Mac OS X 工具窗口中删除最大化按钮【英文标题】:How to remove maximize button in Mac OS X tool window in Qt 【发布时间】:2010-01-13 18:55:30 【问题描述】:我有一个浮动工具窗口。它在 Windows 上运行良好,但我无法获得
摆脱 Mac OS X 上的最大化按钮。我试过取消设置
Qt::WindowMaximizeButtonHint
并将窗口设置为固定大小。
似乎没有任何效果。
MyWidget::MyWidget( QWidget* parent )
:QWidget( parent, Qt::Tool | Qt::CustomizeWindowHint )
setupUi( this );
setFixedSize( sizeHint() ); // doesn't remove maximise button
setWindowFlags( windowFlags() & ~Qt::WindowMaximizeButtonHint ); // doesn't remove maximise button
我不想使用无框窗口。有任何想法吗?我正在使用 Qt 4.4。
【问题讨论】:
【参考方案1】:启动 Qt windowflags 示例应用程序。选择Tool
单选按钮,然后检查:
这是我在 Mac OS X 上找到的唯一方法来实现你想要的但你会失去最小化按钮。没有别的办法。这是 Mac OS X 窗口管理器的限制。
总结一下,标题栏只有五组按钮:
-
所有按钮可见并启用所有按钮:
setWindowFlags(Qt::Tool)
所有按钮可见,关闭和最大化按钮启用,最小化按钮禁用:setWindowFlags(Qt::Tool
| Qt::WindowTitleHint
| Qt::WindowMaximizeButtonHint
| Qt::WindowCloseButtonHint
| Qt::CustomizeWindowHint)
所有按钮可见,最大化按钮启用,关闭和最小化禁用:setWindowFlags(Qt::Tool
| Qt::WindowTitleHint
| Qt::WindowMaximizeButtonHint
| Qt::CustomizeWindowHint)
只有关闭按钮可见并启用setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
标题栏中没有按钮:setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
【讨论】:
卡米尔,很好的答案。不幸的是,Qt::WindowCloseButtonHint 似乎在 Qt 4.4 中不可用! 抱歉,我目前使用的是 Qt 4.6,但我的目的是让您从 Qt 运行 windowflags 示例,以便您可以轻松快速地尝试大多数选项 我在 Qt 4.4 中尝试过 windowflags 示例,但找不到删除最大化按钮的组合。 这至少在 Qt 5.11 中不起作用。 macOS 上的选项 #4 仍然显示最大化按钮。【参考方案2】:来自诺基亚的 Richard Gustavsen 的这段代码适用于 Qt 4.4:
class MyWidget : public QWidget
public:
MyWidget::MyWidget( QWidget* parent ) : QWidget(parent, Qt::Tool)
void setVisible(bool visible)
QWidget::setVisible(visible);
ChangeWindowAttributes(qt_mac_window_for(this), kWindowNoAttributes, kWindowFullZoomAttribute);
;
感谢理查德和诺基亚!
【讨论】:
为什么我用 qt 4.8 64 bit build 找不到 ChangeWindowAttributes?【参考方案3】:您可以尝试将窗口标志设置为包含Qt::Dialog
(加粗):
表示该小部件是一个应装饰为对话框的窗口(即标题栏中通常没有最大化或最小化按钮)。这是 QDialog 的默认类型。如果你想将它用作模式对话框,它应该从另一个窗口启动,或者有一个父窗口并与 QWidget::windowModality 属性一起使用。如果将其设为模态,对话框将阻止应用程序中的其他***窗口获得任何输入。我们将具有父级的***窗口称为辅助窗口。
我不知道如果您尝试同时设置 Qt::Dialog
和 Qt::Tool
会发生什么,但它可能值得研究。
【讨论】:
尝试了两个 Qt::Dialog | Qt::Tool 和 Qt::Dialog。在这两种情况下仍然有一个最大化按钮!【参考方案4】:这是一种跨平台的方法。您已经覆盖了 QMainWindow 或 QWidget 的 setVisible 方法。同样的方式可以修改任何对窗口有视觉影响的窗口标志。
必须这样做的原因是该类在实际显示窗口之前需要具有窗口规范。
void setVisible(bool visible)
setWindowFlags( windowFlags() & ~Qt::WindowMaximizeButtonHint );
QWidget::setVisible(visible);
【讨论】:
这是一个很好的答案,因为它不会取消之前设置的任何窗口标志。【参考方案5】:我可以做到的
setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint)
【讨论】:
以上是关于如何在 Qt 的 Mac OS X 工具窗口中删除最大化按钮的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mac OS X 应用程序部署 Qt - 如何不加载任何插件?