服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++图形界面开发Qt教程:嵌套圆环示例

C++图形界面开发Qt教程:嵌套圆环示例

2021-12-15 13:33不如温暖过生活 C/C++

这篇文章主要介绍了C++实现图形界面开发Qt教程,涉及坐标函数的应用及图形界面程序设计,需要的朋友可以参考下,希望能给你带来帮助

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。

Qt组件推荐:

  • QtitanRibbon|下载试用:遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart|下载试用:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面

 

嵌套圆环图

此示例显示如何使用QPieSeriesAPI创建嵌套的圆环图。

C++图形界面开发Qt教程:嵌套圆环示例

运行示例

要从Qt Creator运行示例,请打开欢迎模式并从示例中选择示例。有关更多信息,请访问构建和运行示例。

创建嵌套圆环图

让我们首先创建一个QChartView实例并在其上启用抗锯齿。甲QChart对象然后从所获得的QChartView实例。图例被禁用,图表的标题被设置。最后一行启用图表的动画。

QChartView *chartView = new QChartView;
chartView->setRenderHint(QPainter::Antialiasing);
QChart *chart = chartView->chart();
chart->legend()->setVisible(false);
chart->setTitle("Nested donuts demo");
chart->setAnimationOptions(QChart::AllAnimations);

定义了三个变量,用于定义圆环图。最小和最大尺寸定义了整个甜甜圈的相对尺寸。minSize 是最小甜甜圈的相对内部尺寸。maxSize 是最大甜甜圈的相对外部尺寸。

qreal minSize = 0.1;
qreal maxSize = 0.9;
int donutCount = 5;

以下代码块定义了各个甜甜圈及其切片。首先创建一个新的QPieSeries对象。每个甜甜圈中的切片数量是随机的。内部 for 循环使用随机值创建切片,标签与值相同。接下来,切片的标签设置为可见,其颜色设置为白色。为了使示例更有趣,切片的悬停信号连接到小部件的插槽,稍后解释其内部工作原理。最后将切片添加到甜甜圈中。调整甜甜圈的大小以实现甜甜圈的嵌套。然后甜甜圈被添加到小部件的甜甜圈列表和图表中。

for (int i = 0; i < donutCount; i++) {
  QPieSeries *donut = new QPieSeries;
  int sliceCount =  3 + QRandomGenerator::global()->bounded(3);
  for (int j = 0; j < sliceCount; j++) {
      qreal value = 100 + QRandomGenerator::global()->bounded(100);
      QPieSlice *slice = new QPieSlice(QString("%1").arg(value), value);
      slice->setLabelVisible(true);
      slice->setLabelColor(Qt::white);
      slice->setLabelPosition(QPieSlice::LabelInsideTangential);
      connect(slice, &QPieSlice::hovered, this, &Widget::explodeSlice);
      donut->append(slice);
      donut->setHoleSize(minSize + i * (maxSize - minSize) / donutCount);
      donut->setPieSize(minSize + (i + 1) * (maxSize - minSize) / donutCount);
  }
  m_donuts.append(donut);
  chartView->chart()->addSeries(donut);
}

最后,小部件被放置在应用程序使用的布局中。

QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(chartView, 1, 1);
setLayout(mainLayout);

为了使示例更有趣,甜甜圈每 1.25 秒随机旋转一次。

updateTimer = new QTimer(this);
connect(updateTimer(updateTimer, &QTimer::timeout, this, &Widget::updateRotation););
updateTimer->start((1250);

小部件的 updatedRotation 槽定义如下。它遍历所有甜甜圈并通过随机值修改它们当前的旋转。

void WidgetWidget::updateRotation()()
{{
  for ((int i = 0; i  i < m_donuts.count(); i(); i++) {
       {
      QPieSeries *donut = m_donuts.at(i);
      (i);
      qreal phaseShift =  -50 + QRandomGenerator::global()()->bounded((100);
      donut->setPieStartAngle(donut(donut->pieStartAngle() () + phaseShift););
      donut->setPieEndAngle(donut(donut->pieEndAngle() () + phaseShift););
  }}
}}

前面提到的explodeSlice 插槽代码在下面提供。如果切片设置为爆炸,则停止控制甜甜圈旋转的计时器。然后从切片中获得切片的开始和结束角度。为了突出显示选定的切片,所有其他甜甜圈从包含选定切片的那个切片向外放置,它们的开始和结束角度都被修改,这样它们就不会“阻挡”突出显示切片的道路。如果不再选择切片,则返回原始状态。

void WidgetWidget::explodeSlice(bool exploded)(bool exploded)
{{
  QPieSlice *slice = qobject_cast<QPieSlice *>(sender());
  sender());
  if (exploded) {(exploded) {
      updateTimer->stop();
      ();
      qreal sliceStartAngle = slice->startAngle();
      ();
      qreal sliceEndAngle = slice->startAngle() () + slice->angleSpan();();

      QPieSeries *donut = slice->series();
      ();
      qreal seriesIndex = m_donuts.indexOf(donut);
      (donut);
      for ((int i = seriesIndex + 1; i  i < m_donuts.count(); i(); i++) { {
          m_donuts.at(i)(i)->setPieStartAngle(sliceEndAngle);(sliceEndAngle);
          m_donuts.at(i)(i)->setPieEndAngle((360 + sliceStartAngle););
      }}
  } } else {
      {
      for ((int i = 0; i  i < m_donuts.count(); i(); i++) { {
          m_donuts.at(i)(i)->setPieStartAngle((0);
          m_donuts.at(i)(i)->setPieEndAngle((360);
      }}
      updateTimer->start();();
  }}
  slice->setExploded(exploded);(exploded);
}}

 

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/qq_42444778/article/details/119605467

延伸 · 阅读

精彩推荐
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22