【问题标题】:QPushButton outside windows (inspiration: CleanMyMac)窗口外的 QPushButton(灵感:CleanMyMac)
【发布时间】:2017-07-14 01:24:33
【问题描述】:

我正在尝试在我的 GUI 中添加一个 QPushButton,这样按钮就在窗口框架之外。一个很好的比较是 CleanMyMac 中的scan 按钮(见附图)。

我尝试让主窗口透明,然后添加仅在底部透明的背景图像,使窗口看起来比实际小。但是,这会产生许多其他复杂情况,例如窗框阴影(似乎并没有完全消失:

mainWindow->setWindowFlags(Qt::FramelessWindowHint | 
                           Qt::NoDropShadowWindowHint)

此外,使用上述方法,窗口无法完全展开,我宁愿按钮的一小部分在显示之外(如 CleanMyMac)。

有什么建议吗?

【问题讨论】:

    标签: c++ qt user-interface


    【解决方案1】:

    您可以使用QWidget::setMask。举个例子,考虑以下类...

    class widget: public QWidget {
      using super = QWidget;
    public:
      explicit widget (QWidget *parent = nullptr)
        : super(parent)
        , m_button("Just hanging here...")
        {
          setLayout(&m_layout);
          m_layout.addWidget(&m_button, 1, 1);
          m_layout.setRowStretch(0, 1);
          m_layout.setColumnStretch(0, 1);
          m_layout.setColumnStretch(2, 1);
        }
    protected:
      virtual void resizeEvent (QResizeEvent *event) override
        {
          super::resizeEvent(event);
          QRect r(rect());
          r.setBottom(m_button.geometry().top());
          QRegion region(r);
          region |= m_button.geometry();
          setMask(region);
        }
    private:
      QGridLayout m_layout;
      QPushButton m_button;
    };
    

    上面给出了类似...

    就目前而言并不是非常有用,但它展示了这项技术。

    【讨论】:

    • 如何将您的小部件对象放入 MainWindow 中,使其像您的图片一样位于窗口下方?非常感谢您的帮助和努力!
    • widget 类有一个 QGridLayout 并添加了 QPushButton。所以这是一个相当基本的小部件/布局设置,但父小部件设置其window mask 是基于它自己的几何图形及其子几何图形的组合——QPushButton。或者,也许更有用的是,尝试使用和调用QWidget::setmask的代码——这可能会更清楚地说明事情。
    • 对对对。我只是注意到然后看到你评论了^^非常感谢!完美运行!我应该可以从这里开始设计。
    【解决方案2】:

    我会将“扫描”按钮设置为顶级小部件(即 button->setWindowFlags(Qt::Window); )使其无框且无边框,如果您希望它为圆形,则为小部件分配一个遮罩,然后在主窗口移动时更新其几何形状。

    所以基本上是 2 个相互重叠的窗口一起移动

    【讨论】:

    • 我实际上也尝试过,但很快意识到用户将在操作系统面板中显示两个窗口以及使用 ctrl+tab 时会显示两个窗口,循环浏览所有窗口。这不好看。否则,这是一个简单而整洁的解决方案!或者有没有办法让系统对第二个窗口视而不见?
    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2013-08-29
    • 2011-12-25
    • 1970-01-01
    • 2014-01-12
    相关资源
    最近更新 更多