Qt 自定义控件 个人用户管理

写了一个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)
{

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值