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();