QT自定义的气泡类型提示框

本文介绍了一种自定义的QT气泡提示控件,该控件可根据需求调整位置及方向,并支持四种不同方向的显示效果。通过设置阴影、边框等属性,使提示更加美观。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    由于项目需要,自定义了一个QT气泡显示的控件,参照了一部分网上的代码,自己也修改了许多,可支持四个不同的方向。不多说,上图:

 

 

代码如下:

 


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


/*****arrow_widget.h*******/

class ArrowWidget : public QWidget
{
    Q_OBJECT
public:
    ArrowWidget(QWidget *parent = 0);
    enum Derection{
        left,
        right,
        up,
        down
    };
    // 设置小三角起始位置;
    void setStartPos(int startX);
    // 设置小三角宽和高;
    void setTriangleInfo(int width, int height);
    void setText(QString s);
    void setDerection(Derection d);
    QString text();
    QGraphicsDropShadowEffect* shadowEffect;
    QLabel *lb_text;
protected:
    void paintEvent(QPaintEvent *);
    void mousePressEvent (QMouseEvent *);
private:
    // 小三角起始位置;
    int m_startX;
    // 小三角的宽度;
    int m_triangleWidth;
    // 小三角高度;
    int m_triangleHeight;
    Derection derect;
};


/*****arrow_widget.cpp*******/

ArrowWidget::ArrowWidget(QWidget *parent): 
    QWidget(parent),
    m_startX(50),
    m_triangleWidth(TRIANGLE_WIDTH),
    m_triangleHeight(TRIANGLE_HEIGHT)
{
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    // 设置阴影边框;
    shadowEffect = new QGraphicsDropShadowEffect(this);
    shadowEffect->setOffset(0, 0);
    shadowEffect->setColor(Qt::gray);
    shadowEffect->setBlurRadius(SHADOW_WIDTH);
    this->setGraphicsEffect(shadowEffect);
    lb_text = new QLabel();
    QHBoxLayout* hMainLayout = new QHBoxLayout(this);
    hMainLayout->addWidget(lb_text);
    hMainLayout->setSpacing(0);
    hMainLayout->setContentsMargins(SHADOW_WIDTH, SHADOW_WIDTH + TRIANGLE_HEIGHT, SHADOW_WIDTH, SHADOW_WIDTH);
}
// 设置小三角显示的起始位置;
void ArrowWidget::setStartPos(int startX)
{
    m_startX = startX;
}

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

void ArrowWidget::setText(QString s)
{
    lb_text->setText (s);
}

void ArrowWidget::setDerection(ArrowWidget::Derection d)
{
    derect = d;
}

QString ArrowWidget::text()
{
    return lb_text->text ();
}

void ArrowWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255, 255, 255, 200));
    // 小三角区域;
    QPainterPath drawPath;
    QPolygon trianglePolygon;
    switch (derect)
    {
        case up:
        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);
        drawPath.addRoundedRect(QRect(SHADOW_WIDTH, m_triangleHeight + SHADOW_WIDTH,\
                                    width() - SHADOW_WIDTH * 2, height() - SHADOW_WIDTH * 2 - m_triangleHeight),\
                                    BORDER_RADIUS, BORDER_RADIUS);
        break;
        case left:
        trianglePolygon << QPoint(3 + m_triangleHeight, 43);
        trianglePolygon << QPoint(8, 48 + m_triangleWidth / 2);
        trianglePolygon << QPoint(3 + m_triangleHeight, 39 + m_triangleWidth);
        drawPath.addRoundedRect(QRect(SHADOW_WIDTH, m_triangleHeight + SHADOW_WIDTH,\
                                    width() - SHADOW_WIDTH * 2, height() - SHADOW_WIDTH * 2 - m_triangleHeight),\
                                    BORDER_RADIUS, BORDER_RADIUS);
        break;
        case right:
        trianglePolygon << QPoint(115, 40);
        trianglePolygon << QPoint(116 + m_triangleHeight, 48 + m_triangleWidth / 2);
        trianglePolygon << QPoint(115, 39 + m_triangleWidth);
        drawPath.addRoundedRect(QRect(SHADOW_WIDTH, m_triangleHeight + SHADOW_WIDTH,\
                                                                    width() - SHADOW_WIDTH * 2, height() - SHADOW_WIDTH * 2 - m_triangleHeight),\
                                    BORDER_RADIUS, BORDER_RADIUS);

        break;
        case down:
        trianglePolygon << QPoint(m_startX, 65);
        trianglePolygon << QPoint(m_startX + m_triangleWidth / 2, 65 + m_triangleHeight);
        trianglePolygon << QPoint(m_startX + m_triangleWidth, 65);
        drawPath.addRoundedRect(QRect(SHADOW_WIDTH, m_triangleHeight + SHADOW_WIDTH,\
                                    width() - SHADOW_WIDTH * 2, height() - SHADOW_WIDTH * 2 - m_triangleHeight),\
                                    BORDER_RADIUS, BORDER_RADIUS);
        break;
    default: break;
    }
    drawPath.addPolygon(trianglePolygon);
    painter.drawPath(drawPath);
}

void ArrowWidget::mousePressEvent(QMouseEvent *)
{
    this->close ();
}


/**********main.cc***********/
   ArrowWidget *w;   
   w = new ArrowWidget(this);  
   w->setDerection (ArrowWidget::left);  
   w->setGeometry (510,103,130, 80);  
   w->setStartPos(60);   
   w->setTriangleInfo(20, 12);  
   w->hide ();

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.youkuaiyun.com/Mario_z/article/details/81699336

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值