ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

封装一些常用的 qt 控件

2022-04-24 17:01:31  阅读:259  来源: 互联网

标签:toast 控件 封装 qt picture tip _- ToolTips layout


在 qt 中需要做 toast 效果和图片 tip 效果,故开发了下面一个类

后续会继续添加一些常用的控件

tool_tip.h

#include <qlabel.h>
#include <qlayout.h>
#include <qwidget.h>

class ToolTips : public QWidget {
  Q_OBJECT

 public:
  enum TipTypes {
    kNone = 0,
    kToastTip,
    kPictureTip,
  };

 public:  // NOLINT
  explicit ToolTips(QWidget* parent = nullptr, TipTypes tip_type = kNone);
  ~ToolTips();
  Q_DISABLE_COPY(ToolTips)

  void ShowToastTip(const QString& tip, const int time = 3000);

 protected:
  void CreateToastTip();
  void CreatePictureTip();

  void HideTip();

 private:
  void Init();

  QWidget* toast_tip_widget_;
  QHBoxLayout* toast_tip_layout_;
  QLabel* toast_tip_;

  QWidget* picture_tip_widget_;
  QHBoxLayout* picture_tip_layout_;
  QLabel* picture_tip_;

  TipTypes tip_type_;

  QString PictureTipText = "图片提示";

  QString ToastTipType = {
      "QLabel {"
      "background-color: #7f7f7f;"
      "border-radius: 4px;"
      "color: #ffffff;"
      "}"};

  // 重写 mousePressEvent 事件
  void mousePressEvent(QMouseEvent* event) override;
};

  

tooltip.cpp

#include "tool_tip.h"

#include <qevent.h>
#include <qimagereader.h>
#include <qtimer.h>

ToolTips::ToolTips(QWidget* parent, TipTypes tip_type)
    : QWidget(parent), tip_type_(tip_type) {
  Init();
  // 默认隐藏 toast 提示
  HideTip();
}

ToolTips::~ToolTips() {}

void ToolTips::Init() {
  switch (tip_type_) {
    case kToastTip:
      CreateToastTip();
      break;
    case kPictureTip:
      CreatePictureTip();
      break;
    default:
      break;
  }
}

void ToolTips::CreateToastTip() {
  toast_tip_widget_ = new QWidget(this);
  toast_tip_widget_->setObjectName(QStringLiteral("toast_tip_widget"));
  toast_tip_layout_ = new QHBoxLayout(toast_tip_widget_);
  toast_tip_layout_->setObjectName(QStringLiteral("toast_tip_layout"));
  toast_tip_ = new QLabel(toast_tip_widget_);
  toast_tip_->setObjectName(QStringLiteral("toast_tip"));
  QFont toast_tip_font = toast_tip_->font();
  toast_tip_font.setPointSize(14 /** scale*/); // scale: 对于 dpi,这边需要乘以相应的屏幕缩放比
  toast_tip_->setFont(toast_tip_font);
  toast_tip_->setStyleSheet(ToastTipType);
  toast_tip_->setAlignment(Qt::AlignCenter);
  toast_tip_layout_->addWidget(toast_tip_);
  toast_tip_layout_->setContentsMargins(0, 0, 0, 0);

  toast_tip_layout_->setSpacing(0);
  this->setLayout(toast_tip_layout_);
}

// TODO: 设计为通用的图片控件
void ToolTips::CreatePictureTip() {
  picture_tip_widget_ = new QWidget(this);
  picture_tip_widget_->setObjectName(QStringLiteral("picture_tip_widget"));
  picture_tip_layout_ = new QHBoxLayout(picture_tip_widget_);
  picture_tip_layout_->setObjectName(QStringLiteral("picture_tip_layout"));
  picture_tip_ = new QLabel(this);
  picture_tip_->setObjectName("picture_tip");
  picture_tip_->setFixedSize(12, 12 /** scale*/);
  picture_tip_->setScaledContents(true);
  QImageReader pic(":/icon/picture_tip.png", "png");
  pic.setAutoDetectImageFormat(false);
  picture_tip_->setPixmap(QPixmap::fromImageReader(&pic));
  picture_tip_->setToolTip(PictureTipText);
  picture_tip_layout_->addWidget(picture_tip_);
  picture_tip_layout_->setContentsMargins(0, 0, 0, 0);

  picture_tip_layout_->setSpacing(0);
  this->setLayout(picture_tip_layout_);
}

void ToolTips::ShowToastTip(const QString& tip, const int time) {
  toast_tip_->setText(tip);
  QTimer::singleShot(time, this, &QWidget::hide);
  show();
}

void ToolTips::HideTip() {
  switch (tip_type_) {
    case kToastTip:
      hide();
      break;
    default:
      break;
  }
}

void ToolTips::mousePressEvent(QMouseEvent* event) {
  if (event->button() == Qt::LeftButton) {
    if (tip_type_ == kPictureTip) {
      // 针对图片控件的鼠标点击做出你需要的事件
    }
    event->accept();
  }
  QWidget::mousePressEvent(event);
}

 

标签:toast,控件,封装,qt,picture,tip,_-,ToolTips,layout
来源: https://www.cnblogs.com/strive-sun/p/16186587.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有