有什么办法可以模糊Qt中的Widget吗?例如,supose我想创建一个“加载...”对话框并模糊背景(不是活动窗口)。模糊QT中的QWidget效果
6
A
回答
8
这个答案是在我的覆盖系列相关答案:first,second,third。
如果您希望在所有平台上都能正常工作,需要注意。您无法将效果直接应用到顶层窗口。层次结构需要看如下:
ContainerWidget
|
+----------+
| |
**Target** Overlay
您适用于Target
插件的效果(比方说,一个QMainWindow
)。 ContainerWidget
是帮助孩子占据小部件完整大小的辅助类。这消除了对明确的零边界布局的需要。
下面的工作,即使在Mac上。它不会,你有没有放弃ContainerWidget
。不幸的是,这仅适用于Qt 5。对QT 4,你的 “跨平台” 支持的Mac排除它:(使用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,0)
#include <QtWidgets>
#endif
class 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, 100, 128});
p.setPen({200, 200, 255});
p.setFont({"arial,helvetica", 48});
p.drawText(rect(), "Loading...", Qt::AlignHCenter | Qt::AlignTop);
}
};
#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
template <typename F> 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));
}
#else
template <typename... Args>
auto singleShot(Args&&... args) -> decltype(QTimer::singleShot(std::forward<Args>(args)...)) {
return QTimer::singleShot(std::forward<Args>(args)...);
}
#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();
singleShot(2000, [&]{
overlay.hide();
label.setGraphicsEffect({});
});
return a.exec();
}
工程确定在Windows
4
参见QGraphicsBlurEffect Class
和QWidget::setGraphicsEffect()
。
0
如果您想对图像应用模糊效果,可以参考this文章。创建模糊图像后,您可以在QWidget::paintEvent()
函数中绘制它。
相关问题
- 1. 模糊效果
- 2. QML模糊效果
- 3. 中央QWidget [Qt]
- 4. WP7背景模糊效果
- 5. 毕业模糊效果
- 6. 模糊按钮效果
- 7. GPUImage +触摸模糊效果
- 8. 模糊效果时滚动
- 9. HTML5高斯模糊效果
- 10. 模糊效果iOS8上
- 11. 实时模糊效果7
- 12. [QT 5.7.1] QWidget的:一个QWidget
- 13. 在iOS7中创建模糊效果
- 14. Qt模糊错误
- 15. 对DrawingVisual的模糊效果的替代
- 16. Android的滚动模糊效果
- 17. iOS 7对videoPlayer的模糊效果
- 18. 创建模糊的背景效果
- 19. 锁定屏幕上的模糊效果
- 20. 手指触摸的Android模糊效果
- 21. 整个网页上的模糊效果
- 22. 对div元素的模糊效果
- 23. 滚动时的运动模糊效果
- 24. iOS的极端模糊效果
- 25. 具有模糊效果的UIImagePickerController
- 26. Html的CSS模糊效果在divs
- 27. Qt 5 - Qt Quick 2中的QWidget
- 28. qt QWidget点击
- 29. Qt QWidget :: setGeomerty
- 30. QT paintEvent为QWidget