048-Third generation software development-data playback

Header image

Third generation software development-data playback

Article directory

  • Third generation software development-data playback
    • Project Introduction
    • Data playback


Keywords:
Qt
Qml
Data
play back
data

Project introduction

Welcome to our QML & C++ project! This project combines the power of QML (Qt Meta-Object Language) and C++ to develop excellent user interfaces and high-performance backend logic.

In the project, we leveraged QML’s declarative syntax and visual design capabilities to create a modern user interface. Through intuitive coding and reusable components, we can quickly develop rich and diverse interface effects and animation effects. At the same time, we use QML’s powerful integration capabilities to easily integrate the underlying logic and data model of C++ into the front-end interface.

On the backend side, we use C++ to write high-performance algorithms, data processing, and computational logic. C++ is a powerful programming language that offers excellent performance and scalability. Our team is committed to optimizing code and reducing resource consumption to ensure that our projects run efficiently on a variety of platforms and devices.

Whether you’re interested in QML and C++ development or need us to build complex user interfaces and backend logic for you, we’re ready to support you. Please feel free to contact us and let’s build a modern, high-performance QML & C++ project together!

Important?

?The price of this column will increase after the third generation soft development update.

Data playback

Um, I just found out when I looked at the code today that this part of the code is still in the demo stage, so I can only see part of it.

#include "XXX_dataplayback.h"
#include "ui_XXX_dataplayback.h"

XXX_dataPlayBack::XXX_dataPlayBack(QWidget *parent,QString strDBPath):
    QWidget(parent),
    ui(new Ui::XXX_dataPlayBack),
    m_strDBPath(strDBPath)
{
    ui->setupUi(this);


    initUI();
    getListDBName();
}

XXX_dataPlayBack::~XXX_dataPlayBack()
{
    deleteDBThread();
    delete ui;
}

void XXX_dataPlayBack::slotTimerMove()
{
    //qDebug() << "slotTimerMove";
    QTime timer;
    timer.start();

    int iIndex = ui->hSlider_move->value();
    ui->hSlider_move->setValue(iIndex + 8*m_iFrequency);


    int iSKye = XXX_BaseDB::instance()->g_vectorKey.at(0);
    int iLeft = m_pDraw1->gCustomplot->xAxis->range().lower + 8*m_iFrequency;

    int iDff = iLeft - iSKye;
    if(iDff > 0)
    {
        XXX_BaseDB::instance()->m_mutexThread.lock();
        if(iDff >= XXX_BaseDB::instance()->g_vectorKey.count())
        {
            XXX_BaseDB::instance()->g_vectorKey.clear();
            XXX_BaseDB::instance()->g_vectorTime.clear();
            XXX_BaseDB::instance()->g_mapTime.clear();
            XXX_BaseDB::instance()->g_vectorData1.clear();
            XXX_BaseDB::instance()->g_vectorData2.clear();
        }
        else
        {
            XXX_BaseDB::instance()->g_vectorKey.remove(0,iDff);
            XXX_BaseDB::instance()->g_vectorTime.remove(0,iDff);
            XXX_BaseDB::instance()->g_vectorData1.remove(0,iDff);
            XXX_BaseDB::instance()->g_vectorData2.remove(0,iDff);
        }
        XXX_BaseDB::instance()->m_mutexThread.unlock();

    }

    ui->label_RunTime->setText(XXX_BaseDB::instance()->g_mapTime.value(m_pDraw1->gCustomplot->xAxis->range().upper));

    qDebug() << "XXX_BaseDB::instance()->g_vectorKey" << XXX_BaseDB::instance()->g_vectorKey.count();


    int iMaxY = quiteMaxData();

    m_pDraw1->setYHeiget(iMaxY);
    m_pDraw2->setYHeiget(iMaxY);


    m_pDraw1->setDataPad(XXX_BaseDB::instance()->g_vectorKey,XXX_BaseDB::instance()->g_vectorData1);
    m_pDraw2->setDataPad(XXX_BaseDB::instance()->g_vectorKey,XXX_BaseDB::instance()->g_vectorData2);


    m_pDraw1->slotMovePad(ui->hSlider_move->value(),m_iPlayX);
    m_pDraw2->slotMovePad(ui->hSlider_move->value(),m_iPlayX);

}


void XXX_dataPlayBack::slotSliderPressed()
{

    if(m_timerMove == nullptr)
        return;
    m_timerMove->stop();

    XXX_BaseDB::instance()->stopDBThread(true);
    XXX_BaseDB::instance()->exitDBThread(false);


}

void XXX_dataPlayBack::slotSliderReleased()
{
    if(m_bRunTimer)
    {
        if(m_timerMove == nullptr)
            return;

        if(ui->hSlider_move->value() < m_iPlayX)
            XXX_BaseDB::instance()->setStartGetID(0,m_iPlayX);
        else
            XXX_BaseDB::instance()->setStartGetID(ui->hSlider_move->value()-m_iPlayX,m_iPlayX);
        XXX_BaseDB::instance()->exitDBThread(true);
        XXX_BaseDB::instance()->stopDBThread(false);

        QThread::msleep(100);
        m_timerMove->start(m_iFrequency);

    }
    else
    {
        if(m_timerMove == nullptr)
            return;

        if(ui->hSlider_move->value() < m_iPlayX)
            XXX_BaseDB::instance()->setStartGetID(0,m_iPlayX);
        else
            XXX_BaseDB::instance()->setStartGetID(ui->hSlider_move->value()-m_iPlayX,m_iPlayX);
        XXX_BaseDB::instance()->exitDBThread(true);
        XXX_BaseDB::instance()->stopDBThread(false);


    }

}

void XXX_dataPlayBack::slotSliderMoved()
{
    qDebug() << "ui->hSlider_move->value()" << ui->hSlider_move->value();

    QString strRunTime;
    XXX_BaseDB::instance()->getFirstTime(ui->hSlider_move->value(),strRunTime);

    ui->label_RunTime->setText(strRunTime);

    if(m_timerMove == nullptr)
        return;
    QTime timer;
    timer.start();

    int iIndex = ui->hSlider_move->value();
    if(iIndex < m_iPlayX)
    {
        XXX_BaseDB::instance()->getDataBase(iIndex,iIndex);
    }
    else
    {
        XXX_BaseDB::instance()->getDataBase(iIndex,m_iPlayX);
    }

    int iMaxY = quiteMaxData();
    m_pDraw1->setYHeiget(iMaxY);

    m_pDraw1->setDataPad(XXX_BaseDB::instance()->g_vectorOneKey,XXX_BaseDB::instance()->g_vectorOneData1);
    m_pDraw1->slotMovePad(iIndex,m_iPlayX);

    m_pDraw2->setYHeiget(iMaxY);

    m_pDraw2->setDataPad(XXX_BaseDB::instance()->g_vectorOneKey,XXX_BaseDB::instance()->g_vectorOneData2);
    m_pDraw2->slotMovePad(iIndex,m_iPlayX);


    qDebug() << "Time elapsed: " << timer.elapsed() << "ms";
}

void XXX_dataPlayBack::slotZoomIn()
{
    ui->pushButton_zoom_out->setVisible(true);
    if(m_iPlayX>1*8000)
    {
        m_iPlayX-=8000;
    }
    else if(m_iPlayX>1000)
    {
        m_iPlayX-=1000;
    }
    else if(m_iPlayX>100)
    {
        m_iPlayX-=100;
    }
    else
    {
        m_iPlayX = 100;
    }

    zoomUpdate();
}

void XXX_dataPlayBack::slotZoomOut()
{
    ui->pushButton_zoom_in->setVisible(true);
    if(m_iPlayX>=20*8000)
    {
        m_iPlayX = 20*8000;
    }
    else if(m_iPlayX>1*8000)
    {
        m_iPlayX + = 1*8000;

    }
    else if(m_iPlayX>=1000)
    {
        m_iPlayX + = 1000;

    }
    else if(m_iPlayX>=100)
    {
        m_iPlayX + = 100;

    }
    else
    {
        m_iPlayX = 100;
    }

    zoomUpdate();

}

void XXX_dataPlayBack::zoomUpdate()
{

    int iIndex = ui->hSlider_move->value();
    if(iIndex < m_iPlayX)
    {
        XXX_BaseDB::instance()->getDataBase(iIndex,iIndex);
    }
    else
    {
        XXX_BaseDB::instance()->getDataBase(iIndex,m_iPlayX);
    }

    int iMaxY = quiteMaxData();
    m_pDraw1->setYHeiget(iMaxY);
    m_pDraw2->setYHeiget(iMaxY);

    m_pDraw1->setDataPad(XXX_BaseDB::instance()->g_vectorOneKey,XXX_BaseDB::instance()->g_vectorOneData1);
// m_pDraw1->slotMovePad(iIndex,m_iPlayX);

    m_pDraw2->setDataPad(XXX_BaseDB::instance()->g_vectorOneKey,XXX_BaseDB::instance()->g_vectorOneData2);
// m_pDraw2->slotMovePad(iIndex,m_iPlayX);



    m_pDraw1->slotMovePad(ui->hSlider_move->value(),m_iPlayX);
    m_pDraw2->slotMovePad(ui->hSlider_move->value(),m_iPlayX);
}

void XXX_dataPlayBack::initUI()
{
    QColor color1(255,0,0);
    QColor color2(0,255,0);
    m_pDraw1 = new XXX_DrawCurve(color1,this);
    m_pDraw2 = new XXX_DrawCurve(color2,this);

    QHBoxLayout *hBox1 = new QHBoxLayout(ui->widge_dataPlay_1);
    QHBoxLayout *hBox2 = new QHBoxLayout(ui->widge_dataPlay_2);
    hBox1->addWidget(m_pDraw1);
    hBox2->addWidget(m_pDraw2);




    //Enable long press
    ui->pushButton_zoom_in->setAutoRepeat(true);
    //Trigger long press time
    ui->pushButton_zoom_in->setAutoRepeatDelay(400);
    //click signal interval when long pressed
    ui->pushButton_zoom_in->setAutoRepeatInterval(50);


    ui->pushButton_zoom_out->setAutoRepeat(true);
    ui->pushButton_zoom_out->setAutoRepeatDelay(400);
    ui->pushButton_zoom_out->setAutoRepeatInterval(50);



    connect(ui->pushButton_zoom_in, & amp;QPushButton::clicked,this, & amp;XXX_dataPlayBack::slotZoomIn);
    connect(ui->pushButton_zoom_out, & amp;QPushButton::clicked,this, & amp;XXX_dataPlayBack::slotZoomOut);


    ui->pushButton_zoom_in->setVisible(false);
    ui->pushButton_zoom_out->setVisible(false);


    ui->hSlider_move->setRange(0,m_iPlayX);

    m_timerMove = new QTimer;
    m_timerMove->setTimerType(Qt::PreciseTimer);

    connect(m_timerMove, & amp;QTimer::timeout, this, & amp;XXX_dataPlayBack::slotTimerMove);


    //
    connect(ui->hSlider_move, & amp;QSlider::sliderPressed, this, & amp;XXX_dataPlayBack::slotSliderPressed);
    connect(ui->hSlider_move, & amp;QSlider::sliderReleased, this, & amp;XXX_dataPlayBack::slotSliderReleased);
    connect(ui->hSlider_move, & amp;QSlider::sliderMoved, this, & amp;XXX_dataPlayBack::slotSliderMoved);
}


void XXX_dataPlayBack::getListDBName()
{
    if(m_strDBPath.isEmpty())
    {
        return;
    }
    QDirIterator it(m_strDBPath, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot | QDir::AllDirs, QDirIterator::Subdirectories);
    while(it.hasNext())
    {
        it.next();
        if(it.fileInfo().suffix() == "db")
        {
            QString strDBName = it.fileName().split(".").at(0);
            m_listDBName.append(strDBName);
        }
    }
    ui->comboBox_DB->addItems(m_listDBName);
}

int XXX_dataPlayBack::quiteMaxData()
{

    int iSurplus = XXX_BaseDB::instance()->g_vectorData1.count() - ui->hSlider_move->value();
    if(iSurplus < 0)
        iSurplus = 0;
    int iFontSurplus = XXX_BaseDB::instance()->g_vectorData1.count() - m_iPlayX - iSurplus;
    if(iFontSurplus< 0)
        iFontSurplus = 0;
    double dMaxID1 = *std::max_element(std::begin(XXX_BaseDB::instance()->g_vectorData1) + iFontSurplus,std::end(XXX_BaseDB::instance()->g_vectorData1)-iSurplus);
    double dMaxID2 = *std::min_element(std::begin(XXX_BaseDB::instance()->g_vectorData2),std::end(XXX_BaseDB::instance()->g_vectorData2));
// double dMinID1 = *std::min_element(std::begin(XXX_BaseDB::instance()->g_vectorData1),std::end(XXX_BaseDB::instance()->g_vectorData1));
// double dMinID2 = *std::min_element(std::begin(XXX_BaseDB::instance()->g_vectorData2),std::end(XXX_BaseDB::instance()->g_vectorData2));


    if(dMaxID2>dMaxID1)
    {
        dMaxID1 = dMaxID2;
    }
    int iMaxY = (int(dMaxID1)/10 + 1)*10;


    return iMaxY;
}

void XXX_dataPlayBack::deleteDBThread()
{
    XXX_BaseDB::instance()->closeDBThread(false);
    XXX_BaseDB::instance()->stopDBThread(true);
    XXX_BaseDB::instance()->exitDBThread(false);


    if(m_threadDBBase->isRunning())
    {
        m_threadDBBase->quit();
        m_threadDBBase->wait();
    }

// m_threadDBBase = nullptr;
// delete m_threadDBBase;
// XXX_BaseDB::instance() = nullptr;
// delete XXX_BaseDB::instance();
}



void XXX_dataPlayBack::on_comboBox_Table_currentTextChanged(const QString & amp;arg1)
{
    m_strTableName = arg1;
    //XXX_BaseDB::instance()->setOpenTableName(m_strTableName);
    int iMaxID;
    XXX_BaseDB::instance()->setOpenTableName(arg1);
    XXX_BaseDB::instance()->getMaxID(iMaxID);
    ui->hSlider_move->setRange(1,iMaxID);

    QString strMaxTime;
    XXX_BaseDB::instance()->getFirstTime(iMaxID,strMaxTime);

    ui->label_LastTime->setText(strMaxTime);

    m_threadDBBase->start();
    XXX_BaseDB::instance()->exitDBThread(true);
    XXX_BaseDB::instance()->closeDBThread(true);
    XXX_BaseDB::instance()->stopDBThread(false);
    XXX_BaseDB::instance()->setStartGetID(0,m_iPlayX);
    emit signalDBThread();
    QThread::msleep(100);
    m_timerMove->start(m_iFrequency);

}


void XXX_dataPlayBack::on_comboBox_DB_currentIndexChanged(int index)
{
    ui->comboBox_Table->clear();

    QString strOpenDBPath = m_strDBPath + m_listDBName.at(index) + ".db";

    //XXX_BaseDB::instance() = new XXX_BaseDB;

    m_threadDBBase = new QThread(this);

    XXX_BaseDB::instance()->moveToThread(m_threadDBBase);

    connect(this, & amp;XXX_dataPlayBack::signalDBThread,XXX_BaseDB::instance(), & amp;XXX_BaseDB::backDataBaseThread);

    QStringList listTableName;
    bool bRet = XXX_BaseDB::instance()->getDBTableName(strOpenDBPath,listTableName);
    if(!bRet)
    {
        return;
    }
    for (int var = 0; var < listTableName.count(); + + var) {
        if(!listTableName.at(var).contains("Default"))
        {
            listTableName.removeAt(var);
        }
    }
    ui->comboBox_Table->addItems(listTableName);
}


void XXX_dataPlayBack::on_pushButton_start_clicked(bool checked)
{
    //m_bRunTimer = checked;

    m_pDraw1->setLabelView(m_bRunTimer);
    m_pDraw2->setLabelView(m_bRunTimer);
    m_bRunTimer = !m_bRunTimer;

    if(m_bRunTimer)
    {
        if(m_timerMove == nullptr)
            return;

        if(ui->hSlider_move->value() < m_iPlayX)
            XXX_BaseDB::instance()->setStartGetID(0,m_iPlayX);
        else
            XXX_BaseDB::instance()->setStartGetID(ui->hSlider_move->value()-m_iPlayX,m_iPlayX);
        XXX_BaseDB::instance()->exitDBThread(true);
        XXX_BaseDB::instance()->stopDBThread(false);

        m_timerMove->start(m_iFrequency);

        ui->pushButton_zoom_in->setVisible(false);
        ui->pushButton_zoom_out->setVisible(false);
        ui->pushButton_start->setText("pause");
    }
    else
    {
        if(m_timerMove == nullptr)
            return;
        m_timerMove->stop();

        XXX_BaseDB::instance()->stopDBThread(true);
        XXX_BaseDB::instance()->exitDBThread(false);

        ui->pushButton_zoom_in->setVisible(true);
        ui->pushButton_zoom_out->setVisible(true);

        ui->pushButton_start->setText("Play");


    }

}


Blog Signature 2021