国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【[Qt]基于QChartView開發(fā)的圖表顯示控件,支持實(shí)時(shí)顯示,動(dòng)態(tài)更新,支持鼠標(biāo)交互等操作】

這篇具有很好參考價(jià)值的文章主要介紹了【[Qt]基于QChartView開發(fā)的圖表顯示控件,支持實(shí)時(shí)顯示,動(dòng)態(tài)更新,支持鼠標(biāo)交互等操作】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

這是一個(gè)Qt平臺(tái)的基于QChartView類的圖像顯示控件,支持鼠標(biāo)交互,支持?jǐn)?shù)據(jù)實(shí)時(shí)顯示,動(dòng)態(tài)更新,坐標(biāo)軸自適應(yīng)點(diǎn)集的值,鼠標(biāo)實(shí)時(shí)點(diǎn)顯示。
實(shí)現(xiàn)平臺(tái):Windows 10 x64 + Qt 6.2.3 + MSVC 2019 

先來(lái)看演示視頻

【[Qt]基于QChartView開發(fā)的圖表顯示控件,支持實(shí)時(shí)顯示,動(dòng)態(tài)更新,支持鼠標(biāo)交互等操作】

控件類關(guān)鍵代碼說(shuō)明

十字線和顯示坐標(biāo)實(shí)現(xiàn)

在.h文件中定義十字線lineitem變量和坐標(biāo)textitem變量

	QGraphicsLineItem *m_xLine;
    QGraphicsLineItem *m_yLine;
    QGraphicsTextItem *m_txtPos;

在Cpp文件中初始化

    m_xLine = new QGraphicsLineItem();
    m_xLine->setPen(QPen(QColor( 100, 100, 100 )));
    m_xLine->setZValue(2);

    m_yLine = new QGraphicsLineItem();
    m_yLine->setPen(QPen(QColor( 100, 100, 100 )));
    m_yLine->setZValue(2);

    scene()->addItem(m_xLine);
    scene()->addItem(m_yLine);

    m_txtPos = new QGraphicsTextItem();
    m_txtPos->setFont(QFont("宋體", 15, QFont::Bold));
    m_txtPos->setVisible(false);
    scene()->addItem(m_txtPos);

然后定義鼠標(biāo)事件,在鼠標(biāo)進(jìn)入時(shí)顯示,移出時(shí)隱藏,移動(dòng)時(shí)顯示。

void ChartDrawer::mouseMoveEvent(QMouseEvent *pEvent)
{
    QPoint point = pEvent->pos();
    m_xLine->setLine(point.x(),0,point.x(),this->height());
    m_yLine->setLine(0,point.y(),this->width(),point.y());
    QPointF chartPoint = m_chart->mapToValue(point);
    m_txtPos->setPlainText(QString("%1,%2").arg(QString::number(chartPoint.x(),'f',3),
                                                QString::number(chartPoint.y(),'f',3)));
    m_txtPos->setPos(point.x(), point.y());
    QChartView::mouseMoveEvent(pEvent);
}
void ChartDrawer::enterEvent(QEnterEvent *pEvent)
{
    m_txtPos->setVisible(true);
    m_xLine->setVisible(true);
    m_yLine->setVisible(true);
    QChartView::leaveEvent(pEvent);
}

void ChartDrawer::leaveEvent(QEvent *pEvent)
{
    m_txtPos->setVisible(false);
    m_xLine->setVisible(false);
    m_yLine->setVisible(false);
    QChartView::leaveEvent(pEvent);
}

其他實(shí)現(xiàn)請(qǐng)參考具體代碼

控件類實(shí)現(xiàn)具體代碼

ChartDrawer.h文件

#ifndef CHARTDRAWER_H
#define CHARTDRAWER_H

#include <QtCharts>
#include <QChartView>
#include <QWidget>
#include <QGraphicsLineItem>
#include <QLabel>
#include <QGraphicsTextItem>

#define UPDATE_DIS 0.001
#define MINOR_TICK_COUNT 10
#define TICK_COUNT_MIN 5
#define TICK_COUNT_MAX 20
#define TICK_DIS_DEFAULT 20
#define DEFAULT_X_MIN 0
#define DEFAULT_X_MAX 10
#define DEFAULT_Y_MIN 0
#define DEFAULT_Y_MAX 10

class ChartDrawer : public QChartView
{
    Q_OBJECT
public:
    explicit ChartDrawer(QWidget *parent = nullptr);
    ~ChartDrawer();

    enum AxisType{
        AxisType_Static = 0,
        AxisType_Slide,
        AxisType_Dynamic
    };

    QAbstractSeries::SeriesType getSeriesType();
    void addSeries(QAbstractSeries::SeriesType type = QAbstractSeries::SeriesTypeLine,QString seriesName = "");
    void setSeriesStyle(QString seriesName = "", Qt::GlobalColor color = Qt::red, int width = 2);
    void setAxisType(AxisType xType = AxisType_Dynamic);
    void setAxisRange(double xMin, double xMax);
    void setAxisRange(double slideDis);
    void setAxisRange();
    double getXAxisRange();
    double getYAxisRange();
    void setAxisTitle(QString xTitle, QString yTitle);
    void setGridVisible(bool isShow);
    void setLegendVisible(bool isShow);
    void setOriginPointFs(QString seriesName, QList<QPointF>);
    void addPointF(QString seriesName, QPointF);
    void clearAllPointF();
    static bool compareX(QPointF a, QPointF b);
    static bool compareY(QPointF a, QPointF b);


    virtual void mousePressEvent(QMouseEvent *pEvent) override;
    virtual void mouseReleaseEvent(QMouseEvent *pEvent) override;
    virtual void wheelEvent(QWheelEvent *pEvent) override;
    virtual void mouseMoveEvent(QMouseEvent *e) override;
    virtual void enterEvent(QEnterEvent *pEvent) override;
    virtual void leaveEvent(QEvent *pEvent) override;

    QChart          *m_chart;
    QValueAxis      *m_xAxis;
    QValueAxis      *m_yAxis;
    QGraphicsLineItem *m_xLine;
    QGraphicsLineItem *m_yLine;
    QGraphicsTextItem *m_txtPos;

    QMap<QString, QXYSeries*>  m_mapSeries;
    QAbstractSeries::SeriesType m_seriesType;
    AxisType m_xAxisType = AxisType_Dynamic;
    double m_xMin, m_xMax, m_yMin, m_yMax;
    double m_slideDis;
    bool m_middleButtonPressed = false;
    QPoint m_oPrePos;

};
#endif // CHARTDRAWER_H

ChartDrawer.cpp 文件

#include "chartdrawer.h"

ChartDrawer::ChartDrawer(QWidget *parent)
    : QChartView{parent},
     m_xMin(0.0),
     m_xMax(10),
     m_yMin(0.0),
     m_yMax(10)
{
    m_chart = new QChart();
    this->setChart(m_chart);
    this->setRubberBand(QChartView::NoRubberBand);
    this->setRenderHint(QPainter::Antialiasing);
    this->setContentsMargins(0,0,0,0);
    //m_chart->setTheme(QChart::ChartThemeDark);

    m_xAxis = new QValueAxis;
    m_xAxis->setLabelFormat("%.3f");
    m_xAxis->setRange(m_xMin,m_xMax);

    m_yAxis = new QValueAxis;
    m_yAxis->setLabelFormat("%.3f");
    m_yAxis->setRange(m_yMin,m_yMax);

    m_chart->addAxis(m_xAxis, Qt::AlignBottom);
    m_chart->addAxis(m_yAxis, Qt::AlignLeft);

    m_xLine = new QGraphicsLineItem();
    m_xLine->setPen(QPen(QColor( 100, 100, 100 )));
    m_xLine->setZValue(2);

    m_yLine = new QGraphicsLineItem();
    m_yLine->setPen(QPen(QColor( 100, 100, 100 )));
    m_yLine->setZValue(2);

    scene()->addItem(m_xLine);
    scene()->addItem(m_yLine);

    m_txtPos = new QGraphicsTextItem();
    m_txtPos->setFont(QFont("宋體", 15, QFont::Bold));
    m_txtPos->setVisible(false);
    scene()->addItem(m_txtPos);

}

ChartDrawer::~ChartDrawer()
{
    deleteLater();
    delete m_xLine;
    delete m_yLine;
    delete m_txtPos;
    m_xLine = nullptr;
    m_yLine = nullptr;
    m_txtPos = nullptr;
}
QAbstractSeries::SeriesType ChartDrawer::getSeriesType()
{
    return m_seriesType;
}
void ChartDrawer::addSeries(QAbstractSeries::SeriesType type,QString seriesName)
{
    m_seriesType = type;
    QXYSeries *series;
    switch(type)
    {
    case QAbstractSeries::SeriesType::SeriesTypeLine:
        series = new QLineSeries(this);
        break;
    case QAbstractSeries::SeriesType::SeriesTypeSpline:
        series = new QSplineSeries(this);
        break;
    case QAbstractSeries::SeriesType::SeriesTypeScatter:
        series = new QScatterSeries(this);
        break;
    default:
        break;
    }

    m_chart->addSeries(series);
    series->setName(seriesName);
    series->attachAxis(m_xAxis);
    series->attachAxis(m_yAxis);
    // 隱藏點(diǎn)標(biāo)簽
    series->setPointLabelsVisible(false);

    m_mapSeries.insert(seriesName,series);
}
void ChartDrawer::setSeriesStyle(QString seriesName, Qt::GlobalColor color, int width)
{
    if(m_mapSeries.find(seriesName).value() == nullptr){
        qDebug() << QStringLiteral("曲線不存在");
        return;
    }
    QPen splinePen;
    splinePen.setBrush(color);
    splinePen.setColor(color);
    splinePen.setWidth(width);
    m_mapSeries[seriesName]->setPen(splinePen);
}

void ChartDrawer::setAxisType(AxisType xType)
{
    m_xAxisType = xType;
}

inline bool ChartDrawer::compareX(QPointF a, QPointF b)
{
    return a.x() > b.x();
}
inline bool ChartDrawer::compareY(QPointF a, QPointF b)
{
    return a.y() > b.y();
}

void ChartDrawer::setAxisRange(double xMin, double xMax)
{
    m_xMin = xMin;
    m_xMax = xMax;
}
void ChartDrawer::setAxisRange(double slideDis)
{
    m_slideDis = slideDis;
}
void ChartDrawer::setAxisRange()
{
    QVector<QPointF> olddata;
    foreach(QXYSeries *series, m_mapSeries){
        olddata << series->points();
    }
    QVector<QPointF> sortData = olddata;

    std::sort(sortData.begin(),sortData.end(),compareY);
    m_yMin = sortData.last().y();
    m_yMax = sortData.first().y();

    m_yAxis->setRange(m_yMin, m_yMax);

    if(m_xAxisType == AxisType_Static){

    } else {
        std::sort(sortData.begin(),sortData.end(),compareX);
        m_xMax = sortData.first().x();
        if(m_xAxisType == AxisType_Slide){
            m_xMin = m_xMax - m_slideDis;
        } else if(m_xAxisType == AxisType_Dynamic) {
            m_xMin = sortData.last().x();
        }
    }
    m_xAxis->setRange(m_xMin, m_xMax);


    //qDebug() << m_xMin << m_xMax << m_yMin << m_yMax;
}
double ChartDrawer::getXAxisRange()
{
    return double(m_xAxis->max() - m_xAxis->min());
}
double ChartDrawer::getYAxisRange()
{
    return double(m_yAxis->max() - m_yAxis->min());
}
void ChartDrawer::setAxisTitle(QString xTitle, QString yTitle)
{
    m_xAxis->setTitleText(xTitle);
    m_yAxis->setTitleText(yTitle);
}

void ChartDrawer::setGridVisible(bool isShow)
{
    int count = double(m_xAxis->max() - m_xAxis->min()) / 20;
    if(count < TICK_COUNT_MIN){
        count = TICK_COUNT_MIN;
    } else if(count > TICK_COUNT_MAX){
        count = TICK_COUNT_MAX;
    }
    m_xAxis->setGridLineVisible(isShow);
    m_xAxis->setTickCount(count);
    m_xAxis->setMinorTickCount(MINOR_TICK_COUNT);

    count = double(m_yAxis->max() - m_yAxis->min()) / 20;
    if(count < TICK_COUNT_MIN){
        count = TICK_COUNT_MIN;
    } else if(count > TICK_COUNT_MAX){
        count = TICK_COUNT_MAX;
    }
    m_yAxis->setGridLineVisible(isShow);
    m_yAxis->setTickCount(count);
    m_yAxis->setMinorTickCount(MINOR_TICK_COUNT);
}

void ChartDrawer::setLegendVisible(bool isShow)
{
    m_chart->legend()->setVisible(isShow);
    /*m_chart->legend()->setLayoutDirection(Qt::LeftToRight);
    m_chart->legend()->setAlignment(Qt::AlignBottom);*/
}
void ChartDrawer::setOriginPointFs(QString seriesName, QList<QPointF> data)
{
    if(m_mapSeries.find(seriesName).value() == nullptr){
        qDebug() << QStringLiteral("曲線不存在");
        return;
    }
    m_mapSeries[seriesName]->append(data);
}
void ChartDrawer::addPointF(QString seriesName, QPointF pointf)
{
    if(m_mapSeries.find(seriesName).value() == nullptr){
        qDebug() << QStringLiteral("曲線不存在");
        return;
    }
    //qDebug() << pointf;
    QVector<QPointF> olddata = m_mapSeries[seriesName]->points();
    if(olddata.size() > 0){
        double xdis = abs(olddata[olddata.size()-1].x() - pointf.x());
        double ydis = abs(olddata[olddata.size()-1].y() - pointf.y());
        //qDebug() << "x:" << xdis << "," << "y:" << ydis;
        if(xdis < UPDATE_DIS && ydis < UPDATE_DIS)
            return;
    }
    olddata.append(pointf);
    m_mapSeries[seriesName]->replace(olddata);
    setAxisRange();
}
void ChartDrawer::clearAllPointF()
{
    foreach(QXYSeries *series, m_mapSeries){
        series->replace(QVector<QPointF>());
    }
}
void ChartDrawer::mousePressEvent(QMouseEvent *pEvent)
{
    if (pEvent->button() == Qt::MiddleButton) {
        m_middleButtonPressed = true;
        m_oPrePos = pEvent->pos();
        this->setCursor(Qt::OpenHandCursor);
    } else if(pEvent->button() == Qt::RightButton) {
        setAxisRange();
    }
    QChartView::mousePressEvent(pEvent);
}
void ChartDrawer::mouseReleaseEvent(QMouseEvent *pEvent)
{
    if (pEvent->button() == Qt::MiddleButton) {
        m_middleButtonPressed = false;
        this->setCursor(Qt::ArrowCursor);
    }
    QChartView::mouseReleaseEvent(pEvent);
}
void ChartDrawer::wheelEvent(QWheelEvent *pEvent)
{

    QPointF point = pEvent->position();
    double rVal = std::pow(0.999, pEvent->angleDelta().y());
    QPointF chartPoint = m_chart->mapToValue(point);

    //計(jì)算當(dāng)前點(diǎn)到最小點(diǎn)和最大點(diǎn)的距離,x軸和y軸
    double oldLeftDis = chartPoint.x() - m_xAxis->min();
    double oldRightDis = m_xAxis->max() - chartPoint.x();
    double oldDownDis = chartPoint.y() - m_yAxis->min();
    double oldUpDis = m_yAxis->max() - chartPoint.y();

    //計(jì)算當(dāng)前點(diǎn)到縮放后的最小點(diǎn)和最大點(diǎn)的距離,x軸和y軸
    double newLeftDis = oldLeftDis * rVal;
    double newRightDis = oldRightDis * rVal;
    double newDownDis = oldDownDis * rVal;
    double newUpDis = oldUpDis * rVal;

    //計(jì)算新的坐標(biāo)最小點(diǎn)和最大點(diǎn)
    double newXMin = chartPoint.x() - newLeftDis;
    double newXMax = chartPoint.x() + newRightDis;
    double newYMin = chartPoint.y() - newDownDis;
    double newYMax = chartPoint.y() + newUpDis;
    //重新設(shè)置坐標(biāo)軸的顯示范圍
    m_xAxis->setRange(newXMin, newXMax);
    m_yAxis->setRange(newYMin, newYMax);

    QChartView::wheelEvent(pEvent);
}
void ChartDrawer::mouseMoveEvent(QMouseEvent *pEvent)
{
    QPoint point = pEvent->pos();
    if (m_middleButtonPressed) {
     QPoint oDeltaPos = point - m_oPrePos;
     m_chart->scroll(-oDeltaPos.x(), oDeltaPos.y());
     m_oPrePos = point;
    }
    m_xLine->setLine(point.x(),0,point.x(),this->height());
    m_yLine->setLine(0,point.y(),this->width(),point.y());
    QPointF chartPoint = m_chart->mapToValue(point);
    m_txtPos->setPlainText(QString("%1,%2").arg(QString::number(chartPoint.x(),'f',3),
                                                QString::number(chartPoint.y(),'f',3)));
    m_txtPos->setPos(point.x(), point.y());
    QChartView::mouseMoveEvent(pEvent);
}
void ChartDrawer::enterEvent(QEnterEvent *pEvent)
{
    m_txtPos->setVisible(true);
    m_xLine->setVisible(true);
    m_yLine->setVisible(true);
    QChartView::leaveEvent(pEvent);
}

void ChartDrawer::leaveEvent(QEvent *pEvent)
{
    m_txtPos->setVisible(false);
    m_xLine->setVisible(false);
    m_yLine->setVisible(false);
    QChartView::leaveEvent(pEvent);
}

控件類的使用

具體使用代碼如下
1、初始化類對(duì)象,并加入界面布局中

	m_chartDrawer = new ChartDrawer(this);
    vLayout->addWidget(m_chartDrawer);
    
	m_chartDrawer->setAxisTitle("時(shí)間/(s)","路程/(m)");
	m_chartDrawer->setGridVisible(true);
	m_chartDrawer->setLegendVisible(false);
	//    m_chartDrawer->setAxisType(ChartDrawer::AxisType::AxisType_Slide);
	//m_chartDrawer->setAxisRange(0,10);
	
	m_chartDrawer->addSeries(QAbstractSeries::SeriesTypeLine,"line0");
	m_chartDrawer->setSeriesStyle("line0", Qt::red, 3);
	m_chartDrawer->setOriginPointFs("line0", QList<QPointF>());
	
	m_chartDrawer->addSeries(QAbstractSeries::SeriesTypeSpline,"line1");
	m_chartDrawer->setSeriesStyle("line1", Qt::green, 3);
	m_chartDrawer->setOriginPointFs("line1", QList<QPointF>());

2、添加點(diǎn)到圖表控件中
我這邊定義了定時(shí)器,每隔1s交換的向兩個(gè)曲線內(nèi)添加一個(gè)點(diǎn)

void MainWindow::timerEvent(QTimerEvent *event)
{
    //qDebug() << "aa";
    m_time += 1;
    srand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
    double  m_distance = QRandomGenerator::global()->bounded(0,20);
    if(m_preLine == "line0")
    {
        m_chartDrawer->addPointF("line1", QPointF(m_time,m_distance));
        m_preLine = "line1";
    }
    else
    {
        m_chartDrawer->addPointF("line0", QPointF(m_time,m_distance));
        m_preLine = "line0";
    }
}

3、從控件中移除所有點(diǎn)

m_chartDrawer->clearAllPointF();

如果還是看不懂、建議直接下載源代碼

源碼鏈接:https://download.csdn.net/download/xiaohuihuihuige/87264001

有幫助的話請(qǐng)點(diǎn)個(gè)贊吧。關(guān)注我,獲取更多自定義控件文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-422016.html

到了這里,關(guān)于【[Qt]基于QChartView開發(fā)的圖表顯示控件,支持實(shí)時(shí)顯示,動(dòng)態(tài)更新,支持鼠標(biāo)交互等操作】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Qt編寫監(jiān)控實(shí)時(shí)顯示和取流回放工具(回放支持切換進(jìn)度)

    Qt編寫監(jiān)控實(shí)時(shí)顯示和取流回放工具(回放支持切換進(jìn)度)

    現(xiàn)在各個(gè)監(jiān)控大廠做的設(shè)備,基本上都會(huì)支持通過(guò)rtsp直接取流顯示,而且做的比較好的還支持通過(guò)rtsp回放取流,基本上都會(huì)約定一個(gè)字符串的規(guī)則,每個(gè)廠家都是不一樣的規(guī)則,比如回放對(duì)應(yīng)的rtsp地址還要帶上時(shí)間范圍,回放肯定要指定一個(gè)開始時(shí)間和結(jié)束時(shí)間。這里需要

    2024年02月10日
    瀏覽(19)
  • Qt/C++編寫監(jiān)控實(shí)時(shí)顯示和取流回放工具(回放支持切換進(jìn)度)

    Qt/C++編寫監(jiān)控實(shí)時(shí)顯示和取流回放工具(回放支持切換進(jìn)度)

    現(xiàn)在各個(gè)監(jiān)控大廠做的設(shè)備,基本上都會(huì)支持通過(guò)rtsp直接取流顯示,而且做的比較好的還支持通過(guò)rtsp回放取流,基本上都會(huì)約定一個(gè)字符串的規(guī)則,每個(gè)廠家都是不一樣的規(guī)則,比如回放對(duì)應(yīng)的rtsp地址還要帶上時(shí)間范圍,回放肯定要指定一個(gè)開始時(shí)間和結(jié)束時(shí)間。這里需要

    2024年02月11日
    瀏覽(21)
  • Qt6使用QChartView類與鼠標(biāo)事件實(shí)現(xiàn)波形的縮放、平移、坐標(biāo)軸單軸縮放與鼠標(biāo)懸停顯示點(diǎn)的數(shù)據(jù)

    Qt6使用QChartView類與鼠標(biāo)事件實(shí)現(xiàn)波形的縮放、平移、坐標(biāo)軸單軸縮放與鼠標(biāo)懸停顯示點(diǎn)的數(shù)據(jù)

    ? ? ? ? 說(shuō)在前面,本人也是近段時(shí)間剛開始學(xué)習(xí)Qt,實(shí)現(xiàn)上述功能的方法可能并不是最優(yōu),寫此篇文章也是記錄下學(xué)習(xí)的過(guò)程,也與大家分享一下。(在此先描述,后面會(huì)附上代碼)(前面說(shuō)的會(huì)比較基礎(chǔ)) ? ? ? ? 首先,要使用QChartView類得現(xiàn)在.pro文件中加入:(得確保

    2024年02月09日
    瀏覽(43)
  • 基于Qt5的圖像交互控件開發(fā)(C++實(shí)現(xiàn))

    基于Qt5的圖像交互控件開發(fā)(C++實(shí)現(xiàn))

    博主近期看到海康VM、halcon以及visionpro視覺(jué)軟件都包含一個(gè)圖像智能交互控件,然后近期根據(jù)其中的技術(shù)原理,也基于Qt5仿照開發(fā)了一個(gè)類似的功能,包含矩形、旋轉(zhuǎn)矩形、任意多邊形、圓、圓環(huán)、扇環(huán),直線卡尺以及圓卡尺等常用控件,圖像智能交互是在計(jì)算機(jī)視覺(jué)領(lǐng)域中

    2024年02月05日
    瀏覽(64)
  • Qt音視頻開發(fā)44-本地?cái)z像頭推流(支持分辨率/幀率等設(shè)置/實(shí)時(shí)性極高)

    Qt音視頻開發(fā)44-本地?cái)z像頭推流(支持分辨率/幀率等設(shè)置/實(shí)時(shí)性極高)

    本地?cái)z像頭推流和本地桌面推流類似,無(wú)非就是采集的設(shè)備源頭換成了本地?cái)z像頭設(shè)備而不是桌面,其他代碼完全一樣。采集本地?cái)z像頭實(shí)時(shí)視頻要注意的是如果設(shè)置分辨率和幀率,一定要是設(shè)備本身就支持的,如果不支持那就歇菜,比如設(shè)備本身最大分辨率到1280x720,你主

    2024年02月05日
    瀏覽(27)
  • Qt音視頻開發(fā)43-采集屏幕桌面并推流(支持分辨率/矩形區(qū)域/幀率等設(shè)置/實(shí)時(shí)性極高)

    采集電腦屏幕桌面并推流一般是用來(lái)做共享桌面、遠(yuǎn)程協(xié)助、投屏之類的應(yīng)用,最簡(jiǎn)單入門的做法可能會(huì)采用開個(gè)定時(shí)器或者線程抓圖,將整個(gè)屏幕截圖下來(lái),然后將圖片傳出去,這種方式很簡(jiǎn)單但是性能要低不少,一般采用ffmpeg來(lái)做桌面推流的居多,畢竟如果不采用代碼直

    2024年02月03日
    瀏覽(31)
  • Qt QScrollArea顯示控件,并且調(diào)節(jié)控件大小

    Qt QScrollArea顯示控件,并且調(diào)節(jié)控件大小

    實(shí)現(xiàn)效果: (1)首先要理解 QScrollArea控件出現(xiàn)滾動(dòng)條的方式,具體參考(11條消息) QT的自動(dòng)滾動(dòng)區(qū)QScrollArea的用法,圖文詳解_暴躁的野生猿的博客-CSDN博客_qscrollarea ?在scrollArea的子控件設(shè)置mininumSize就是顯示滾動(dòng)條關(guān)鍵; (2)在?QScrollArea 添加自定義控件(這里以添加QPushB

    2024年02月11日
    瀏覽(27)
  • 海康威視攝像頭二次開發(fā)_云臺(tái)控制_視頻畫面實(shí)時(shí)預(yù)覽(基于Qt實(shí)現(xiàn))

    ??低晹z像頭二次開發(fā)_云臺(tái)控制_視頻畫面實(shí)時(shí)預(yù)覽(基于Qt實(shí)現(xiàn))

    需求:需要在公司的產(chǎn)品里集成海康威視攝像頭的SDK,用于控制??低暤臄z像頭。 拍照抓圖、視頻錄制、云臺(tái)控制、視頻實(shí)時(shí)預(yù)覽等等功能。 開發(fā)環(huán)境: windows-X64(系統(tǒng)) + Qt5.12.6(Qt版本) + MSVC2017_X64(使用的編譯器) ??低曁峁┝?設(shè)備網(wǎng)絡(luò)SDK ,設(shè)備網(wǎng)絡(luò)SDK是基于設(shè)備私有網(wǎng)

    2024年02月13日
    瀏覽(22)
  • Qt QWidget 抗鋸齒圓角窗口的一個(gè)實(shí)現(xiàn)方案(支持子控件)

    Qt QWidget 抗鋸齒圓角窗口的一個(gè)實(shí)現(xiàn)方案(支持子控件)

    由于 QWidget::setMask 接口設(shè)置圓角不支持抗鋸齒,所以通常會(huì)使用透明窗口加圓角背景,但圓角背景不能滿足對(duì)子控件的裁剪,子控件與圓角區(qū)域重疊的部分還是能顯示出來(lái)。當(dāng)然對(duì)于大多數(shù)窗口,留出足夠的邊距也是可以接受。 對(duì)一些特殊場(chǎng)景,比如QComboBox的列表框,UI設(shè)計(jì)

    2023年04月24日
    瀏覽(38)
  • QT QChartView 鼠標(biāo)隨動(dòng) 十字線 縮放 平移 拖動(dòng)

    QT QChartView 鼠標(biāo)隨動(dòng) 十字線 縮放 平移 拖動(dòng)

    QChart添加跟隨鼠標(biāo)的十字線_x縣豆瓣醬的博客-CSDN博客_qchart鼠標(biāo)跟蹤線 最近在做這么一個(gè)東西,需要十字線。我參考自上面的博主的內(nèi)容,但是他沒(méi)寫全。很多人不知道這個(gè)QGraphicsLineItem 是怎么創(chuàng)建的,然后x_line 和y_line 是如何弄到chartview 的Scene中的。 下面試我的效果,實(shí)現(xiàn)

    2024年02月12日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包