其他分享
首页 > 其他分享> > 封装一些常用的 qt 控件

封装一些常用的 qt 控件

作者:互联网

在 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