Qt小例子学习67 - 获取放置在图形场景中的对象的放置事件

这个博客介绍了如何在Qt环境中实现一个SpeedoMeter类,该类继承自QwtDial,能够处理对象的放置事件。文章详细展示了dragEnterEvent、dropEvent和dragMoveEvent等函数的实现,用于接受并处理拖放数据,特别是从QAbstractItemModel数据源拖来的数据。当有数据被放置到SpeedoMeter上时,会更新显示的标签。

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

Qt小例子学习67 - 获取放置在图形场景中的对象的放置事件

SpeedoMeter.h

#ifndef SPEEDOMETER_H
#define SPEEDOMETER_H

#include <qwt_dial.h>

class SpeedoMeter : public QwtDial
{
public:
    SpeedoMeter(QWidget *parent = nullptr);

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void paintEvent(QPaintEvent *event);

private:
    QString d_label;
};

#endif // SPEEDOMETER_H

SpeedoMeter.cpp

#include "speedometer.h"

#include <qwt_dial_needle.h>

#include <QDragEnterEvent>
#include <QMimeData>
#include <QPainter>

SpeedoMeter::SpeedoMeter(QWidget *parent) : QwtDial(parent), d_label("km/h")
{
    setAcceptDrops(true);
    QwtDialSimpleNeedle *nd =
        new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow, Qt::white, Qt::red);
    setNeedle(nd);
    setValue(80);
}

void SpeedoMeter::dragEnterEvent(QDragEnterEvent *event)
{
    if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
        event->acceptProposedAction();
}

void SpeedoMeter::dropEvent(QDropEvent *event)
{
    const QMimeData *mimedata = event->mimeData();

    if (mimedata->hasFormat("application/x-qabstractitemmodeldatalist"))
    {
        QString text;
        QByteArray encoded =
            mimedata->data("application/x-qabstractitemmodeldatalist");
        QDataStream stream(&encoded, QIODevice::ReadOnly);
        while (!stream.atEnd())
        {
            int row, col;
            QMap<int, QVariant> roleDataMap;
            stream >> row >> col >> roleDataMap;
            if (roleDataMap.contains(Qt::DisplayRole))
            {
                text = roleDataMap[Qt::DisplayRole].toString();
                break;
            }
        }
        // your text
        d_label = text;
        update();
    }
}

void SpeedoMeter::dragMoveEvent(QDragMoveEvent *event)
{
    if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
        event->accept();
}

void SpeedoMeter::paintEvent(QPaintEvent *event)
{
    QwtDial::paintEvent(event);
    QPainter painter(this);
    painter.setPen(Qt::black);
    QFont font;
    font.setPointSize(11);
    painter.setFont(font);
    QString text = QString("%1 %2").arg(value()).arg(d_label);
    QPoint c = rect().center();
    QSize Size = painter.fontMetrics().size(Qt::TextSingleLine, text);
    painter.drawText(
        QPointF(c.x() - Size.width() / 2, c.y() + 2.5 * Size.height()), text);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值