Qml之坐标轴的实现及曲线添加

      前面一张文章介绍过在利用QPainter接口画可拖动的圆,通过官方介绍:

Graphics in Qt 5 is primarily done either through the imperative QPainter API, or through Qt’s declarative UI language, Qt Quick, and its scene graph back-end. 

我们知道在Qt5中使用Qt Quick模块也可以实现简单图形的绘制。可是当我们需要在QML中实现坐标轴的时候,感觉用QtQuick实现起来有点力不从心了。不过先别沮丧,看看这个QQuickPaintedItem:

The QQuickPaintedItem class provides a way to use the QPainter API in the QML Scene Graph.

Qt的大牛应该考虑到了QtQuick的不足了,有了这个东东,你就可以在QML上发挥你的想象力了。

 

我继承了QQuickPaintedItem,实现了它的paint方法,在此方法里画坐标轴及添加曲线。代码如下:

 

void QAxis::paint(QPainter *painter)
{

    m_painter = painter;

    //随坐标轴取值范围变化,更新坐标标签及其位置
    if(m_xAutoScale)
        upDateXLabels();
    if(m_yAutoScale)
        upDateYLabels();

    initXYState();

    m_painter->setRenderHint(QPainter::Antialiasing);

    QMap<QString, Curve*>::const_iterator cur;
    for(cur=m_curveList.begin(); cur!=m_curveList.end(); cur++)
    {       
        for(int j=0; j<cur.value()->getDataSize(); j++)
        {
            QPointF tmp = cur.value()->getPosData(j);
            m_painter->setPen(cur.value()->getPointPen());
            m_painter->drawEllipse(tmp.x()-1, tmp.y()-1, 2, 2);

            //draw curve title
            if(j == cur.value()->getDataSize() - 1)
            {
                if(cur.value()->getTitleShow())
                {
                    QPen pen;
                    pen.setColor(Qt::red);
                    m_painter->setPen(pen);

                    double x = tmp.x()+8;
                    double y = tmp.y();
                    if(x > m_xPosMax - 20)
                        x = x - 25;
                    if(y > m_yPosMax - 20)
                        y = y - 25;

                    m_painter->drawText(QPointF(x, y), cur.value()->getTitle());
                }

                break;
            }

            m_painter->setPen(cur.value()->getLinePen());
            m_painter->drawLine(cur.value()->getPosData(j), cur.value()->getPosData(j+1));
        }
    }
}

 

 

在QML中显示坐标轴:

 

import QtQuick 2.3
import QtQuick.Window 2.0
import QtQuick.Controls 1.1
//import QtQuick.Controls.Styles 1.1

import QtQml 2.2

import com.robinson.qaxis 1.0

ApplicationWindow {
    id: mainWindow
    visible: true
    width: Screen.width/2
    height: Screen.height/2

    QAxis {
        id: qAxis
        anchors.fill: parent

        Component.onCompleted: {
            //setDirection("down");
            setXValueRange(0, 10);
            setYValueRange(0, 10);

            setXLabels("0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
            setYLabels("0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10");

            setAutoScale("X", true);
            setAutoScale("Y", true);

            addCurve("testCurve");
            setGridShow(true);
            addData("testCurve", 0, 0);
            addData("testCurve", 2, 2);
            addData("testCurve", 5, 3);
        }
    }

    //使坐标轴自适应窗口大小
    onWidthChanged: qAxis.setAxisSize(mainWindow.width, mainWindow.height);
    onHeightChanged: qAxis.setAxisSize(mainWindow.width, mainWindow.height);
}


最后看下效果图:

 

 

源码下载地址1:CSDN

源码下载地址2:https://github.com/RobinsonSir/QmlQAxis

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML(Qt Meta-Object Language)是一种用于创建用户界面和应用程序逻辑的声明性语言。想要实现一个视频剪辑时间轴,可以利用QML的强大功能和Qt的多媒体模块。 首先,需要创建一个QML界面,其中包含一个用于显示视频剪辑的时间轴的控件。可以使用Qt Quick Controls中的Slider控件,该控件可以很容易地与时间轴交互。在QML中创建Slider控件并设置其最小值和最大值,以及当前值来表示时间轴的范围。 在QML中,可以使用Qt Multimedia模块的Video类型来加载和播放视频。为了在时间轴上显示视频剪辑,可以创建一个矩形形项,并在矩形中使用Video作为其源。根据视频的位置和长度,可以调整矩形在时间轴上的显示位置和大小。 接下来,需要实现时间轴的交互功能。可以捕获Slider控件的valueChanged信号,并根据其值在视频中切换到相应的时间点。同时,还可以通过拖动视频剪辑矩形形项来调整剪辑的位置和长度。 为了实现视频剪辑的添加和删除功能,可以在时间轴上添加按钮或其他交互元素。通过点击按钮,可以根据用户的选择添加新的视频剪辑矩形形项,并根据用户的操作来删除剪辑。 总之,要实现一个qml视频剪辑时间轴,需要创建一个QML界面,使用Slider控件表示时间轴的范围,并通过Qt的多媒体模块加载和播放视频。通过交互元素和信号槽机制,可以实现剪辑的调整、添加和删除功能。这样,用户就可以方便地在时间轴上进行视频剪辑操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值