
如果您希望它可以在所有平台上运行,则需要一些小心.您无法直接将效果应用于顶级窗口.层次结构需要如下所示:
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的模糊效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)