【问题标题】:How to remove maximize button in Mac OS X tool window in Qt如何在 Qt 的 Mac OS X 工具窗口中删除最大化按钮
【发布时间】: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。

【问题讨论】:

    标签: macos qt


    【解决方案1】:

    启动 Qt windowflags 示例应用程序。选择Tool单选按钮,然后检查:

    • 窗口标题
    • 自定义窗口
    • 窗口关闭按钮

    这是我在 Mac OS X 上找到的唯一方法来实现你想要的但你会失去最小化按钮。没有别的办法。这是 Mac OS X 窗口管理器的限制。

    总结一下,标题栏只有五组按钮:

    1. 所有按钮可见并启用所有按钮:setWindowFlags(Qt::Tool)
    2. 所有按钮可见,关闭和最大化按钮启用,最小化按钮禁用:setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
    3. 所有按钮可见,最大化按钮启用,关闭和最小化禁用:setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint | Qt::CustomizeWindowHint)
    4. 只有关闭按钮可见并启用setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
    5. 标题栏中没有按钮: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)
    

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 2011-12-31
      • 2010-09-25
      • 2011-04-26
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 2023-03-07
      • 2011-07-26
      相关资源
      最近更新 更多