c – 在Qt中对QWidget的模糊效果

c – 在Qt中对QWidget的模糊效果,第1张

概述有没有办法模糊Qt中的小部件?例如,supose我想创建一个’Loading …’对话框并模糊背景(非活动窗口). 这个答案是我的一系列与叠加相关的答案: first, second, third. 如果您希望它可以在所有平台上运行,则需要一些小心.您无法直接将效果应用于顶级窗口.层次结构需要如下所示: ContainerWidget | +----------+ | 有没有办法模糊Qt中的小部件?例如,supose我想创建一个’Loading …’对话框并模糊背景(非活动窗口).解决方法 这个答案是我的一系列与叠加相关的答案: first,second,third.

如果您希望它可以在所有平台上运行,则需要一些小心.您无法直接将效果应用于顶级窗口.层次结构需要如下所示:

ContainerWidget     |     +----------+     |          |**Target**   Overlay

您将效果应用于Target小部件(例如,QMainWindow). ContainerWidget是一个帮助程序类,可以让子项占用窗口小部件的完整大小.这消除了对显式零边距布局的需要.

以下工作,甚至在Mac上.如果放弃了ContainerWidget,它就不会.不幸的是,这仅适用于Qt 5.在Qt 4上,你的“跨平台”支持不包括Mac :(它在windows上使用Qt 4(4.8.5)或Qt 5正常工作.

// https://github.com/KubaO/stackoverflown/tree/master/questions/overlay-blur-19383427#include <QtGui>#if QT_VERSION >= QT_VERSION_CHECK(5,0)#include <QtWidgets>#endifclass OverlayWidget : public QWidget {   voID newParent() {      if (!parent()) return;      parent()->installEventFilter(this);      raise();   }public:   explicit OverlayWidget(QWidget *parent = {}) : QWidget(parent) {      setAttribute(Qt::WA_NoSystemBackground);      setAttribute(Qt::WA_transparentForMouseEvents);      newParent();   }protected:   //! Catches resize and child events from the parent Widget   bool eventFilter(QObject *obj,QEvent *ev) overrIDe {      if (obj == parent()) {         if (ev->type() == QEvent::Resize)            resize(static_cast<QResizeEvent*>(ev)->size());         else if (ev->type() == QEvent::ChildAdded)            raise();      }      return QWidget::eventFilter(obj,ev);   }   //! Tracks parent Widget changes   bool event(QEvent *ev) overrIDe {      if (ev->type() == QEvent::ParentAbouttochange) {         if (parent()) parent()->removeEventFilter(this);      }      else if (ev->type() == QEvent::ParentChange)         newParent();      return QWidget::event(ev);   }};class ContainerWidget : public QWidget{public:   explicit ContainerWidget(QWidget *parent = {}) : QWidget(parent) {}   voID setSize(QObject *obj) {      if (obj->isWidgetType()) static_cast<QWidget*>(obj)->setGeometry(rect());   }protected:   //! Resizes children to fill the extent of this Widget   bool event(QEvent *ev) overrIDe {      if (ev->type() == QEvent::ChildAdded) {         setSize(static_cast<QChildEvent*>(ev)->child());      }      return QWidget::event(ev);   }   //! Keeps the children appropriately sized   voID resizeEvent(QResizeEvent *) overrIDe {      for(auto obj : children()) setSize(obj);   }};class LoadingOverlay : public OverlayWidget{public:   LoadingOverlay(QWidget *parent = {}) : OverlayWidget{parent} {      setAttribute(Qt::WA_TranslucentBackground);   }protected:   voID paintEvent(QPaintEvent *) overrIDe {      QPainter p{this};      p.fillRect(rect(),{100,100,128});      p.setPen({200,200,255});      p.setFont({"arial,helvetica",48});      p.drawText(rect(),"Loading...",Qt::AlignHCenter | Qt::Aligntop);   }};namespace compat {#if QT_VERSION >= QT_VERSION_CHECK(5,4,0)using QT_PREPEND_nameSPACE(QTimer);#elseusing Q_QTimer = QT_PREPEND_nameSPACE(QTimer);class QTimer : public Q_QTimer {public:   QTimer(QTimer *parent = nullptr) : Q_QTimer(parent) {}   template <typename F> static voID singleShot(int period,F &&fun) {      struct Helper : public QObject {         F fun;         QBasicTimer timer;         voID timerEvent(QTimerEvent *event) overrIDe {            if (event->timerID() != timer.timerID()) return;            fun();            deleteLater();         }         Helper(int period,F &&fun) : fun(std::forward<F>(fun)) {            timer.start(period,this);         }      };      new Helper(period,std::forward<F>(fun));   }};#endif}int main(int argc,char *argv[]){   QApplication a{argc,argv};   ContainerWidget base;   QLabel label("Dewey,Cheatem and Howe,LLC.",&base);   label.setFont({"times,times new roman",32});   label.setAlignment(Qt::AlignCenter);   label.setGraphicsEffect(new QGraphicsBlurEffect);   LoadingOverlay overlay(&base);   base.show();   compat::QTimer::singleShot(2000,[&]{      overlay.hIDe();      label.setGraphicsEffect({});   });   return a.exec();}
总结

以上是内存溢出为你收集整理的c – 在Qt中对QWidget的模糊效果全部内容,希望文章能够帮你解决c – 在Qt中对QWidget的模糊效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1238129.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存