Qt基础 自定义消息框

ps:忘记copy那位大佬tip代码了,后面新增可以点选的控件


#pragma once

#include <QWidget>
#include <QHBoxLayout>

#define SHADOW_WIDTH 15                 // 窗口阴影宽度;
#define TRIANGLE_WIDTH 15               // 小三角的宽度;
#define TRIANGLE_HEIGHT 10              // 小三角的高度;
#define BORDER_RADIUS 5                 // 窗口边角的弧度;

class ToolWidget : public QWidget
{
	Q_OBJECT

public:
	ToolWidget(QWidget *parent = nullptr);
	~ToolWidget();
public:
	// 设置小三角起始位置;
	void setStartPos(int startX);

	// 设置小三角宽和高;
	void setTriangleInfo(int width, int height);

	// 设置中间区域widget;
	void setCenterWidget(QWidget* widget);
private:
	int boundaryWidth;
	QPoint clickPos;
	QHBoxLayout* m_hLayout;
private:
	// 小三角起始位置;
	int m_startX;
	// 小三角的宽度;
	int m_triangleWidth;
	// 小三角高度;
	int m_triangleHeight;

	QHBoxLayout* hMainLayout1;
protected:
	void paintEvent(QPaintEvent* e);
};
#include "ToolWidget.h"
#include <QPainter>
#include <QGraphicsDropShadowEffect>

ToolWidget::ToolWidget(QWidget *parent)
	: QWidget(parent)
{
	setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
	setAttribute(Qt::WA_TranslucentBackground);

	// 设置阴影边框;
	auto shadowEffect = new QGraphicsDropShadowEffect(this);
	shadowEffect->setOffset(0, 0);
	shadowEffect->setColor(Qt::black);
	shadowEffect->setBlurRadius(SHADOW_WIDTH);
	this->setGraphicsEffect(shadowEffect);
    setFixedSize(150, 200);
    m_hLayout = new QHBoxLayout(this);
}

ToolWidget::~ToolWidget()
{
}

void ToolWidget::setStartPos(int startX)
{
	m_startX = startX;
}

void ToolWidget::setTriangleInfo(int width, int height)
{
	m_triangleWidth = width;
	m_triangleHeight = height;
}

void ToolWidget::setCenterWidget(QWidget* widget)
{
    m_hLayout->addWidget(widget);
    m_hLayout->setSpacing(0);
    m_hLayout->setContentsMargins(SHADOW_WIDTH, SHADOW_WIDTH + TRIANGLE_HEIGHT + 5, SHADOW_WIDTH, SHADOW_WIDTH);
}

void ToolWidget::paintEvent(QPaintEvent* e)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(0, 0, 0));

    // 小三角区域;
    QPolygon trianglePolygon;
    trianglePolygon << QPoint(m_startX, this->height() - SHADOW_WIDTH);//左下角
    trianglePolygon << QPoint(m_startX + m_triangleWidth / 2, this->height() + SHADOW_WIDTH - 20);//定点
    trianglePolygon << QPoint(m_startX + m_triangleWidth, this->height() - SHADOW_WIDTH);//右下角

/*
    QPolygon trianglePolygon;
       trianglePolygon << QPoint(m_startX, m_triangleHeight + SHADOW_WIDTH);
       trianglePolygon << QPoint(m_startX + m_triangleWidth / 2, SHADOW_WIDTH);
       trianglePolygon << QPoint(m_startX + m_triangleWidth, m_triangleHeight + SHADOW_WIDTH);
*/
    QPainterPath drawPath;
    drawPath.addRoundedRect(QRect(SHADOW_WIDTH, m_triangleHeight + SHADOW_WIDTH, \
        width() - SHADOW_WIDTH * 2, height() - SHADOW_WIDTH * 2 - m_triangleHeight), \
        BORDER_RADIUS, BORDER_RADIUS);

    // Rect + Triangle;
    drawPath.addPolygon(trianglePolygon);
    painter.drawPath(drawPath);
    QWidget::paintEvent(e);
}

使用,按钮的样式就不给了。 

    reNameBt = new QPushButton();
	addBt = new QPushButton();
	closeBt = new QPushButton();
	connect(reNameBt, &QPushButton::clicked, this, &ColourUserDlg::ReName);
	connect(addBt, &QPushButton::clicked, this, &ColourUserDlg::Copy);
	connect(closeBt, &QPushButton::clicked, this, &ColourUserDlg::Delete);
	
	
	m_pToolWidget = new ToolWidget();
	m_pToolWidget->setStartPos(65);
	m_pToolWidget->setTriangleInfo(20, 12);
	m_pToolWidget->setFixedSize(QSize(150, 80));
	reNameBt->setMaximumSize(25, 25);
	addBt->setMaximumSize(25, 25);
	closeBt->setMaximumSize(25, 25);
	m_pToolWidget->setCenterWidget(reNameBt);
	m_pToolWidget->setCenterWidget(addBt);
	m_pToolWidget->setCenterWidget(closeBt);	
	m_pToolWidget->show();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路奇怪

有钱出钱,没钱多出编程主意啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值