最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt圖形圖像開(kāi)發(fā)之Qt曲線圖美化QChart QScatterSeries 空心點(diǎn)陣圖,鼠標(biāo)移動(dòng)到上面顯示數(shù)值,鼠標(biāo)移開(kāi)數(shù)值消失效果實(shí)例

 更新時(shí)間:2020年03月12日 16:18:44   作者:漫步繁華街  
這篇文章主要介紹了Qt圖形圖像開(kāi)發(fā)之Qt曲線圖美化QChart QScatterSeries 空心點(diǎn)陣圖,鼠標(biāo)移動(dòng)到上面顯示數(shù)值,鼠標(biāo)移開(kāi)數(shù)值消失效果實(shí)例,需要的朋友可以參考下

最近接到一個(gè)Qt QChart曲線圖美化的需求,畫一個(gè)折線圖,關(guān)鍵點(diǎn)使用空心的圓點(diǎn)標(biāo)識(shí)出來(lái),鼠標(biāo)移動(dòng)到關(guān)鍵點(diǎn)上,顯示出當(dāng)前數(shù)值;鼠標(biāo)移走數(shù)值消失。

效果圖如下:

我們遇到這個(gè)需求的時(shí)候,第一時(shí)間就會(huì)想到使用 QLineSeries 畫折線圖。

首先初始化

  QChart *chart = new QChart();
  chart->legend()->setVisible(false);
  ui->chartView->setChart(chart);
  ui->chartView->setRenderHint(QPainter::Antialiasing);
 
  chart->setBackgroundBrush(QBrush(QColor(248, 251, 255)));

將每個(gè)點(diǎn)添加到QLineSeries序列中。然后就會(huì)形成折線圖。如下:

  QChart *chart = ui->chartView->chart();
  chart->removeAllSeries();
  chart->removeAxis(chart->axisX());
  chart->removeAxis(chart->axisY());
 
  //折線圖
  QLineSeries *series0 = new QLineSeries();
 
  QPen pen;
  pen.setStyle(Qt::SolidLine);
  pen.setWidth(4);
  pen.setColor(QColor(21, 100, 255));
  series0->setPen(pen);//折現(xiàn)序列的線條設(shè)置
  QLineSeries *series0 = (QLineSeries *)ui->chartView->chart()->series().at(0);
 
  series0->clear();
 
  qsrand(QTime::currentTime().second());
 
  qreal t=0, y1, intv=1;
  qreal rd;
  int cnt=16;
  for (int i=0; i<cnt; i++)
  {
    rd = (qrand() % 100);
    y1=rd;
    series0->append(t, y1);
    t+=intv;
  }

這是完成了第一步,畫出來(lái)了折線圖。但是對(duì)于那些圓點(diǎn)要顯示出來(lái)的話我們可以考慮使用QScatterSeries來(lái)畫一些離散的點(diǎn)。

  QScatterSeries *series1 = new QScatterSeries();
  series1->setMarkerShape(QScatterSeries::MarkerShapeCircle);//圓形的點(diǎn)
  series1->setBorderColor(QColor(21, 100, 255)); //離散點(diǎn)邊框顏色
  series1->setBrush(QBrush(QColor(21, 100, 255)));//離散點(diǎn)背景色
  series1->setMarkerSize(12); //離散點(diǎn)大小
  QLineSeries *series0 = (QLineSeries *)ui->chartView->chart()->series().at(0);
  QScatterSeries *series1 = (QScatterSeries *)ui->chartView->chart()->series().at(1);
 
  series0->clear();
  series1->clear();
 
  qsrand(QTime::currentTime().second());
 
  qreal t=0, y1, intv=1;
  qreal rd;
  int cnt=16;
  for (int i=0; i<cnt; i++)
  {
    rd = (qrand() % 100);
    y1=rd;
    series0->append(t, y1);
    series1->append(t, y1);
 
    t+=intv;
  }

然后我們添加了一些離散的點(diǎn),效果如下圖:

很顯然,雖然添加了離散的圓形的點(diǎn),但是并沒(méi)有滿足我們的需求,因?yàn)樾枨笫强招牡膱A點(diǎn)。而且控件也沒(méi)提供相關(guān)函數(shù)可以設(shè)置成空心。但是這里面有3個(gè)函數(shù)值得注意

  series1->setBorderColor(QColor(21, 100, 255)); //離散點(diǎn)邊框顏色
  series1->setBrush(QBrush(QColor(21, 100, 255)));//離散點(diǎn)背景色
  series1->setMarkerSize(12); //離散點(diǎn)大小

因?yàn)榭梢栽O(shè)置一個(gè)點(diǎn)的大小,邊框和顏色。那我們?nèi)绻雽?shí)現(xiàn)一個(gè)空心的離散點(diǎn)就可以這樣做:

以同一個(gè)位置為圓心,畫兩個(gè)半徑不同的實(shí)心圓。下面的圓半徑大,顏色就是邊框的顏色藍(lán)色;上面的圓形半徑小,顏色設(shè)置為白色。這樣兩個(gè)圓形疊加起來(lái)的效果,視覺(jué)上就是一個(gè)空心的圓形。按照這個(gè)思路,我們需要使用2個(gè)QScatterSeries序列

series0 : 半徑較大,背景為藍(lán)色,充當(dāng)邊框。

series1:半徑較小,北京為白色,充電圓心。

  //散點(diǎn)圖(用于邊框)
  QScatterSeries *series1 = new QScatterSeries();
  series1->setMarkerShape(QScatterSeries::MarkerShapeCircle);//圓形的點(diǎn)
  series1->setBorderColor(QColor(21, 100, 255)); //邊框顏色
  series1->setBrush(QBrush(QColor(21, 100, 255)));//背景顏色
  series1->setMarkerSize(12);           //點(diǎn)大小
 
  //散點(diǎn)圖(用于中心)
  QScatterSeries *series2 = new QScatterSeries();
  series2->setMarkerShape(QScatterSeries::MarkerShapeCircle);//圓形的點(diǎn)
  series2->setBorderColor(Qt::white);//邊框顏色
  series2->setBrush(QBrush(Qt::white));//背景顏色
  series2->setMarkerSize(6);//點(diǎn)大小
 
  chart->addSeries(series1);
  chart->addSeries(series2);
  QLineSeries *series0 = (QLineSeries *)ui->chartView->chart()->series().at(0);
  QScatterSeries *series1 = (QScatterSeries *)ui->chartView->chart()->series().at(1);
  QScatterSeries *series2 = (QScatterSeries *)ui->chartView->chart()->series().at(2);
 
  series0->clear();
  series1->clear();
  series2->clear();
 
  qsrand(QTime::currentTime().second());
 
  qreal t=0, y1, intv=1;
  qreal rd;
  int cnt=16;
  for (int i=0; i<cnt; i++)
  {
    rd = (qrand() % 100);
    y1=rd;
    series0->append(t, y1);
    series1->append(t, y1);
    series2->append(t, y1);
 
    t+=intv;
  }

效果如下:

做完這些,我們還有最后一個(gè)需求就是鼠標(biāo)移動(dòng)到這些離散的點(diǎn)上,要顯示出當(dāng)前點(diǎn)的數(shù)值。由于框架并沒(méi)有提供相關(guān)的api,所以我們要自己完成這項(xiàng)工作。我們可以想象,顯示的數(shù)值需要使用QLabel承載,當(dāng)鼠標(biāo)移動(dòng)到這些點(diǎn)上,QLabel就show,移開(kāi)就hide。那么怎么確定鼠標(biāo)是否移動(dòng)到這些離散點(diǎn)上呢?查閱文檔,我們發(fā)現(xiàn)QCatterSeries有這樣一個(gè)信號(hào)

他的意思就是,這是一個(gè)信號(hào),當(dāng)鼠標(biāo)移動(dòng)到上面,或者從上面移開(kāi)就會(huì)發(fā)射這個(gè)信號(hào),其中point是移動(dòng)到哪個(gè)點(diǎn)上,當(dāng)移動(dòng)到上面,state=true;否則state就為false。

我們可以連接這個(gè)信號(hào)到我們自己的槽函數(shù)

connect(series2, &QScatterSeries::hovered, this, &TDMTrendChartForm::slotPointHoverd);//用于鼠標(biāo)移動(dòng)到點(diǎn)上顯示數(shù)值
void TDMTrendChartForm::slotPointHoverd(const QPointF &point, bool state)
{
  if (state) {
    m_valueLabel->setText(QString::asprintf("%1.0f%", point.y()));
 
    QPoint curPos = mapFromGlobal(QCursor::pos());
    m_valueLabel->move(curPos.x() - m_valueLabel->width() / 2, curPos.y() - m_valueLabel->height() * 1.5);//移動(dòng)數(shù)值
 
    m_valueLabel->show();//顯示出來(lái)
  }
  else
    m_valueLabel->hide();//進(jìn)行隱藏
 
}

實(shí)例源碼中完善些代碼,增加鼠標(biāo)懸浮在離散點(diǎn)上,應(yīng)該顯示漸變的邊框。

這樣我們就完成了相關(guān)功能。完整代碼可以在這里下載

本文主要講解了Qt曲線圖美化QCharts QScatterSeries 空心點(diǎn)陣圖,鼠標(biāo)移動(dòng)到上面顯示數(shù)值,鼠標(biāo)移開(kāi)數(shù)值消失效果實(shí)例,更多關(guān)于Qt曲線圖QCharts模塊的知識(shí)請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

  • 在C++程序中開(kāi)啟和禁用Windows設(shè)備的無(wú)線網(wǎng)卡的方法

    在C++程序中開(kāi)啟和禁用Windows設(shè)備的無(wú)線網(wǎng)卡的方法

    這篇文章主要介紹了在C++程序中開(kāi)啟和禁用Windows設(shè)備的無(wú)線網(wǎng)卡的方法,包括一些常見(jiàn)錯(cuò)誤的分析與解決,需要的朋友可以參考下
    2016-03-03
  • c++ map,mutimap刪除問(wèn)題分析

    c++ map,mutimap刪除問(wèn)題分析

    本文詳細(xì)介紹c++ map,mutimap刪除操作時(shí)的一些問(wèn)題,提供了解決方法,需要的朋友可以參考下
    2012-11-11
  • C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法

    C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • C++中基本的輸入輸出函數(shù)使用指南

    C++中基本的輸入輸出函數(shù)使用指南

    這篇文章主要介紹了C++中基本的輸入輸出函數(shù)使用指南,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++時(shí)間戳轉(zhuǎn)化操作實(shí)例分析【涉及GMT與CST時(shí)區(qū)轉(zhuǎn)化】

    C++時(shí)間戳轉(zhuǎn)化操作實(shí)例分析【涉及GMT與CST時(shí)區(qū)轉(zhuǎn)化】

    這篇文章主要介紹了C++時(shí)間戳轉(zhuǎn)化操作,結(jié)合實(shí)例形式分析了C++時(shí)間戳轉(zhuǎn)換與顯示操作的原理與具體實(shí)現(xiàn)技巧,涉及GMT與CST時(shí)區(qū)轉(zhuǎn)化,需要的朋友可以參考下
    2017-05-05
  • C語(yǔ)言初識(shí)變量常量字符串轉(zhuǎn)義符及注釋方式簡(jiǎn)介

    C語(yǔ)言初識(shí)變量常量字符串轉(zhuǎn)義符及注釋方式簡(jiǎn)介

    最強(qiáng)的C語(yǔ)言筆記,此處對(duì)于C語(yǔ)言的基礎(chǔ)部分做一個(gè)簡(jiǎn)要的介紹,作者實(shí)屬初學(xué),寫博客也是作者學(xué)習(xí)的一個(gè)過(guò)程,若文中內(nèi)容有理解不到位或者有不當(dāng)之處,還請(qǐng)朋友們不吝指正
    2021-11-11
  • 基于Qt實(shí)現(xiàn)系統(tǒng)主題感知功能

    基于Qt實(shí)現(xiàn)系統(tǒng)主題感知功能

    在現(xiàn)代桌面應(yīng)用程序開(kāi)發(fā)中,系統(tǒng)主題感知是一項(xiàng)重要的功能,它使得應(yīng)用程序能夠根據(jù)用戶的系統(tǒng)主題設(shè)置(如深色模式或淺色模式)自動(dòng)調(diào)整其外觀,Qt 作為一個(gè)跨平臺(tái)的C++圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架,提供了豐富的工具和類來(lái)實(shí)現(xiàn)這一功能,需要的朋友可以參考下
    2024-12-12
  • 用C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲

    用C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++基于EasyX庫(kù)實(shí)現(xiàn)拼圖小游戲

    C++基于EasyX庫(kù)實(shí)現(xiàn)拼圖小游戲

    這篇文章主要為大家詳細(xì)介紹了C++基于EasyX庫(kù)實(shí)現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++中變量進(jìn)行初始化的3種方法

    C++中變量進(jìn)行初始化的3種方法

    本文主要介紹了C++中變量進(jìn)行初始化的3種方法,包括用"=",構(gòu)造函數(shù)初始化以及統(tǒng)一初始化這三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02

最新評(píng)論

南京市| 克拉玛依市| 濮阳市| 南康市| 玉溪市| 永安市| 峨山| 蒙城县| 砀山县| 沁水县| 中超| 仪征市| 莱芜市| 恩施市| 冷水江市| 兴文县| 苏州市| 凤山市| 黔东| 新晃| 泽普县| 南郑县| 绩溪县| 尖扎县| 赤水市| 齐河县| 广安市| 城市| 定远县| 平原县| 商南县| 二连浩特市| 云浮市| 买车| 舞钢市| 辉南县| 昔阳县| 东丰县| 微山县| 财经| 应城市|