loadingmask.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "loadingmask.h"
  2. #include <QPainter>
  3. #include <QResizeEvent>
  4. LoadingMask::LoadingMask(QWidget *parent) : QWidget(parent) {
  5. // 设置为无边框窗口
  6. setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
  7. setAttribute(Qt::WA_TranslucentBackground);
  8. // 初始化加载提示标签
  9. loadingLabel = new QLabel(this);
  10. loadingLabel->setStyleSheet("QLabel { color: white; font-size: 16px; "
  11. "background-color: rgba(0, 0, 0, 120); "
  12. "padding: 10px 20px; border-radius: 5px; }");
  13. loadingLabel->setAlignment(Qt::AlignCenter);
  14. // 初始化超时定时器
  15. timeoutTimer = new QTimer(this);
  16. timeoutTimer->setSingleShot(true);
  17. connect(timeoutTimer, &QTimer::timeout, this, &LoadingMask::onTimeout);
  18. // 安装事件过滤器以处理父窗口大小变化
  19. if (parent) {
  20. parent->installEventFilter(this);
  21. }
  22. }
  23. void LoadingMask::show(QWidget* parent, const QString &text, int timeout) {
  24. // 创建新的遮罩实例(会在隐藏时自动删除)
  25. LoadingMask* mask = new LoadingMask(parent);
  26. mask->setAttribute(Qt::WA_DeleteOnClose);
  27. // 设置遮罩大小为父窗口大小
  28. mask->setGeometry(parent->rect());
  29. // 设置提示文本
  30. mask->loadingLabel->setText(text);
  31. mask->loadingLabel->adjustSize();
  32. mask->loadingLabel->move((mask->width() - mask->loadingLabel->width()) / 2,
  33. (mask->height() - mask->loadingLabel->height()) / 2);
  34. // 启动超时定时器
  35. if (timeout > 0) {
  36. mask->timeoutTimer->start(timeout);
  37. }
  38. mask->QWidget::show();
  39. mask->raise();
  40. }
  41. void LoadingMask::hideOverlay() {
  42. timeoutTimer->stop();
  43. close(); // 使用 close 而不是 hide,因为设置了 DeleteOnClose
  44. }
  45. void LoadingMask::paintEvent(QPaintEvent *event) {
  46. QPainter painter(this);
  47. painter.fillRect(rect(), QColor(0, 0, 0, 128)); // 半透明黑色背景
  48. }
  49. bool LoadingMask::eventFilter(QObject *watched, QEvent *event) {
  50. if (watched == parent()) {
  51. if (event->type() == QEvent::Resize) {
  52. // 父窗口大小改变时,调整遮罩层大小
  53. QResizeEvent *resizeEvent = static_cast<QResizeEvent*>(event);
  54. setGeometry(0, 0, resizeEvent->size().width(), resizeEvent->size().height());
  55. // 重新居中显示加载提示
  56. loadingLabel->move((width() - loadingLabel->width()) / 2,
  57. (height() - loadingLabel->height()) / 2);
  58. }
  59. }
  60. return QWidget::eventFilter(watched, event);
  61. }
  62. void LoadingMask::onTimeout() {
  63. hideOverlay();
  64. }