如何在 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::DialogQt::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 工具窗口中删除最大化按钮的主要内容,如果未能解决你的问题,请参考以下文章

PySide 全屏 Mac os x 小部件

使用 Mac OS X 应用程序部署 Qt - 如何不加载任何插件?

如何在 MAC OS X 中获得最大 TCP 接收/发送窗口?

如何在 Mac OS X 中获取光标相对于窗口的位置?

Mac OS X 上的 Qt 库和源代码安装在哪里?

我如何在 Mac OS X 上判断我是不是安装了 Carbon 或 Cocoa 版本的 Qt?