写了一个Qt 控件 继承于 QWidget 实现效果是用户管理 右上角增加一个叉 可以实现删除用户的效果
点击右上角叉号会触发 delCustom 信号 可以绑定该信号实现业务代码
MyShopManager.h
#pragma once
#include <QWidget>
class MyShopManager : public QWidget
{
Q_OBJECT
public:
MyShopManager(QWidget *parent=nullptr);
~MyShopManager();
//设置用户名称
void setStr(const QString& strName);
//设置用户头像
void setPixMap(const QPixmap& pix);
protected:
//绘图事件
virtual void paintEvent(QPaintEvent* event);
//进入事件
virtual void enterEvent(QEvent* event);
//离开事件
virtual void leaveEvent(QEvent* event);
//鼠标移动事件
virtual void mouseMoveEvent(QMouseEvent* event);
//鼠标点击事件
virtual void mousePressEvent(QMouseEvent* event);
//鼠标松开事件
virtual void mouseReleaseEvent(QMouseEvent* event);
private:
bool m_isEnter=false;
bool m_isLarger = false;
QString m_text = "";
QPixmap m_pix;
signals:
void delCustom();
};
MyShopManager.cpp
#include "MyShopManager.h"
#include <QPainter>
#include <QPen>
#include <QtMath>
#include <QDebug>
#include <QMouseEvent>
#define SIZE (25) //定义删除框大小
#define MULTISIZE (1.2) //定义放大倍数
#define TEXTAREA (20) //文字显示宽度
#define IMAGEMARGIN (10) //头像显示外部缩进
#define IMAGEPADDING (0) //头像显示内部缩进
#if _MSC_VER>=1600
#pragma execution_character_set("utf-8")
#endif
MyShopManager::MyShopManager(QWidget *parent)
: QWidget(parent)
{
//隐藏标题栏
setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint);
setMouseTracking(true);
resize(300, 300);
m_text = "用户管理";
}
MyShopManager::~MyShopManager()
{
}
void MyShopManager::setStr(const QString& strName)
{
m_text = strName;
}
void MyShopManager::setPixMap(const QPixmap& pix)
{
m_pix = pix;
}
void MyShopManager::paintEvent(QPaintEvent* event)
{
qDebug() << "isenter:" << m_isEnter << "islarger:" << m_isLarger;
//isLarger = true;
QPen pen;
QPainter painter(this);
pen.setWidth(2);
painter.setPen(pen);
painter.save();
画图形
QRectF target(IMAGEMARGIN, IMAGEMARGIN, width() - 2 * IMAGEMARGIN, height() - TEXTAREA - 2 * IMAGEMARGIN);
QPixmap pixmap(":/miniProgramManager/image/P96YY_20_1361_001.png");
QRectF source(0, 0, pixmap.width(), pixmap.height());
painter.drawPixmap(target, pixmap, source);
//画文字
QPoint lf = QPoint(0, height() - TEXTAREA);
QPoint rg(width(), height());
QRect rect(lf, rg);
painter.drawText(rect, Qt::AlignHCenter | Qt::AlignVCenter, m_text);
if (m_isEnter)
{
int size = SIZE;
if (m_isLarger)
{
size = MULTISIZE * SIZE;
}
//画圆
painter.drawArc(QRect(width() - size, 0, size, size), 0 * 16, 360 * 16);
pen.setColor(Qt::red);
pen.setWidth(3);
painter.setPen(pen);
//划线
int div = qSin(M_PI / 4) * size/2;
QPoint lfPt = QPoint(width() - size / 2 - div, size / 2 - div);
QPoint rbPt = QPoint(width() - size / 2 + div, size / 2 + div);
painter.drawLine(lfPt, rbPt);
painter.drawLine(QPoint(width() - size / 2 - div, size / 2 + div), QPoint(width() - size / 2 + div, size / 2 - div));
}
else
{
//painter.drawText(100, 100, "leave");
}
painter.restore();
}
void MyShopManager::enterEvent(QEvent* event)
{
m_isEnter = true;
update();
}
void MyShopManager::leaveEvent(QEvent* event)
{
m_isEnter = false;
update();
}
void MyShopManager::mouseMoveEvent(QMouseEvent* event)
{
qDebug() << "rect" << width() - SIZE<<";" << SIZE;
QPoint pos = event->pos();
qDebug() << pos.x() << pos.y();
if ((pos.x()>width()- SIZE)&&(pos.y()< SIZE))
{
m_isLarger = true;
}
else {
m_isLarger = false;
}
update();
}
void MyShopManager::mousePressEvent(QMouseEvent* event)
{
QPoint pos = event->pos();
qDebug() << pos.x() << pos.y();
if ((pos.x() > width() - MULTISIZE*SIZE) && (pos.y() <MULTISIZE*SIZE))
{
emit delCustom();
}
}
void MyShopManager::mouseReleaseEvent(QMouseEvent* event)
{
}