Qt自定义图形实现拖拽效果

本文介绍如何在Qt中自定义图形并实现其拖拽功能。通过重写paintEvent事件绘制箭头形状,并利用mousePressEvent和mouseMoveEvent实现控件的拖动。此方法适用于需要动态图形界面的应用。
摘要由CSDN通过智能技术生成

在这里自定义图形是通过QPaintEvent事件绘画的图形,也可以通过自定义控件的方式添加到qt中。

首先定义类来自定义图形,这里通过paintEvent事件来实现(主要就是绘画一个图形)

void QEventView::paintEvent(QPaintEvent *event)
{
    resize(115+m_iLen,36);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::blue);

    //定义箭头的坐标
    static const QPoint pointArr[7] =
    {
      QPoint(0,10),
      QPoint(100+m_iLen,10),
      QPoint(100+m_iLen,0),
      QPoint(115+m_iLen,18),
      QPoint(100+m_iLen,36),
      QPoint(100+m_iLen,26),
      QPoint(0,26)
    };
    int i = 0;

    while(i < 7)
    {
        if(i == 6)
            painter.drawLine(pointArr[i],pointArr[0]);
        else
            painter.drawLine(pointArr[i],pointArr[i+1]);
        i++;
    }
    painter.drawText(QPoint(0,22),m_sEventName);

}

接着,主窗口程序通过mousePressEvent() mouseMoveEvent(),实现拖拽移动,

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<" 1:"<<event->pos();
    //获取控件的对象
    m_pTempWidget =  childAt(event->pos());
    qDebug()<<m_pTempWidget;
    if(!m_pTempWidget || m_pTempWidget == centralWidget())
        return;
    //容器存储自定义图形指针,以及图形的位置
    QMap<QEventView*,QPoint>::iterator iter = m_mapEventPoint.begin();
    while(iter != m_mapEventPoint.end())
    {
        if(iter.key() == m_pTempWidget)
        {
            m_windowInitPoint = iter.key()->frameGeometry().topLeft();
            m_StartPoint = event->pos();
            break;
        }
        ++iter;
    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    QMap<QEventView*,QPoint>::iterator iter = m_mapEventPoint.begin();
    while(iter != m_mapEventPoint.end())
    {
        if(iter.key() == m_pTempWidget)
        {

            QPoint distance = event->pos() - m_StartPoint;
            iter.key()->move(m_windowInitPoint + distance);
            break;
        }
        ++iter;
    }
}

就能实现简单的拖拽功能,效果图如下:

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值