QT控件大全 四十一 QLightBoxWidget
来源:互联网 发布:冰点下载器 mac版 编辑:程序博客网 时间:2024/05/15 15:31
效果如图:
核心代码:
#ifndef QLIGHTBOXWIDGET_H#define QLIGHTBOXWIDGET_H#include <QWidget>/** * @brief Класс перекрытия */class QLightBoxWidget : public QWidget{Q_OBJECTpublic:explicit QLightBoxWidget(QWidget* _parent, bool _folowToHeadWidget = false);protected:/** * @brief Переопределяется для отслеживания собитий родительского виджета */bool eventFilter(QObject* _object, QEvent* _event);/** * @brief Переопределяется для того, чтобы эмитировать эффект перекрытия */void paintEvent(QPaintEvent* _event);/** * @brief Переопределяется для того, чтобы перед отображением настроить внешний вид */void showEvent(QShowEvent* _event);private:/** * @brief Обновить размер и картинку фона */void updateSelf();/** * @brief Разрешает конфликт рекурсивного обновления */bool m_isInUpdateSelf;/** * @brief Обновить картинку фона */QPixmap grabParentWidgetPixmap() const;/** * @brief Картинка фона */QPixmap m_parentWidgetPixmap;};#endif // QLIGHTBOXWIDGET_H
#include "qlightboxwidget.h"#include <QPixmap>#include <QEvent>#include <QPaintEvent>#include <QChildEvent>#include <QPainter>QLightBoxWidget::QLightBoxWidget(QWidget* _parent, bool _folowToHeadWidget) :QWidget(_parent),m_isInUpdateSelf(false){//// Родительский виджет должен быть обязательно установлен//Q_ASSERT_X(_parent, "", Q_FUNC_INFO);//// Если необходимо, делаем родителем самый "старший" виджет//if (_folowToHeadWidget) {while (_parent->parentWidget() != 0) {_parent = _parent->parentWidget();}setParent(_parent);}//// Следим за событиями родительского виджета, чтобы// иметь возможность перерисовать его, когда изменяется размер и т.п.//_parent->installEventFilter(this);//// Скрываем виджет//setVisible(false);}bool QLightBoxWidget::eventFilter(QObject* _object, QEvent* _event){//// Виджету необходимо всегда быть последним ребёнком,// чтобы перекрывать остальные виджеты при отображении//if (_event->type() == QEvent::ChildAdded) {QChildEvent* childEvent = dynamic_cast<QChildEvent*>(_event);if (childEvent->child() != this) {QWidget* parent = parentWidget();setParent(0);setParent(parent);}}//// Если изменился размер родительского виджета, необходимо// перерисовать себя//if (isVisible()&& _event->type() == QEvent::Resize) {updateSelf();}return QWidget::eventFilter(_object, _event);}void QLightBoxWidget::paintEvent(QPaintEvent* _event){//// Рисуем фон//QPainter p;p.begin(this);// ... фото родительского виджетаp.drawPixmap(0, 0, width(), height(), m_parentWidgetPixmap);// ... накладываем затемнённую областьp.setBrush(QBrush(QColor(0, 0, 0, 220)));p.drawRect(0, 0, width(), height());p.end();//// Рисуем всё остальное//QWidget::paintEvent(_event);}void QLightBoxWidget::showEvent(QShowEvent* _event){//// Обновим себя//updateSelf();//// Показываемся//QWidget::showEvent(_event);}void QLightBoxWidget::updateSelf(){if (!m_isInUpdateSelf) {m_isInUpdateSelf = true;{//// Обновляем отображение//hide();resize(parentWidget()->size());m_parentWidgetPixmap = grabParentWidgetPixmap();show();}m_isInUpdateSelf = false;}}QPixmap QLightBoxWidget::grabParentWidgetPixmap() const{QPixmap parentWidgetPixmap;#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))parentWidgetPixmap = parentWidget()->grab();#elseparentWidgetPixmap = QPixmap::grabWidget(parentWidget());#endifreturn parentWidgetPixmap;}
源码工程:QQ:609162385
阅读全文
0 0
- QT控件大全 四十一 QLightBoxWidget
- Qt编写自定义控件大全
- QT控件大全一AnalogWidgets
- QT控件大全二VirtualKeyboard
- QT控件大全三QLed
- QT控件大全四QMeter
- QT控件大全五QProgressIndicator
- QT控件大全 六 QVUMeter
- QT控件大全 七 QProg
- QT控件大全 八 QNeedleIndicator
- QT控件大全 九 Qnightcharts
- QT控件大全 十 QPower
- QT控件大全 十一 QLock
- QT控件大全 十二 QScale
- QT控件大全 十三 WidgetMarqueeLabel
- QT控件大全 十四 QProgressmeter
- QT控件大全 十五 QPot
- QT控件大全 十五 QOpenChart
- / ./ ../ 的区别
- 用glxinfo|grep "OpenGL renderer"可以看目前使用哪个显卡。比如我的机器上:$ glxinfo|grep "OpenGL renderer" OpenGL renderer
- css 学习笔记 position float block 的理解
- 剑指offer 试题31~40
- jsp、Servlet路径映射与生命周期
- QT控件大全 四十一 QLightBoxWidget
- spring cloud+es+kafka+zipkin windows环境搭建调用链监控
- 用一条查询SQL统计某个字段各字符及出现的次数,并按出现次数倒序排列。
- serialVersionUID作用
- 双十二年终盛典,EasyRecovery与您一起
- 深入SpringMVC组件开发【1】
- 融云成为“2017年度CIO最信赖供应商” 加速企业IM能力升级
- 机器学习竞赛技巧
- JAVA代理那些事儿