C++界面开发Qt示例:条形图数据

此示例说明如何使用QAbstractItemModel派生模型作为条形系列的数据。

Qt组件推荐:

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

条形模块 示例

此示例说明如何使用QAbstractItemModel派生模型作为条形系列的数据。

C++界面开发Qt示例:条形图数据

运行示例

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

将数据模型与条形图结合使用

让我们从创建 CustomTableModel 类的实例开始。CustomTableModel 类派生自QAbstractTableModel,它是为本示例而创建的。此类的构造函数使用图表示例所需的数据填充模型的内部数据存储。

m_model = new CustomTableModel;

我们现在有一个模型,其中包含我们希望在图表和QTableView 中显示的数据。首先,我们创建QTableView并告诉它使用模型作为数据源。为了很好地呈现数据,设置了表格视图的最小宽度,并将其标题调整大小模式更改为拉伸。

QTableView *tableView = new QTableView;tableView->setModel(m_model);tableView->setMinimumWidth(300);tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);m_model->setParent(tableView);

现在我们需要一个QChart实例来在图表上显示相同的数据。我们还启用动画。它可以更轻松地查看对模型数据的修改如何影响图表。

QChart *chart = new QChart;chart->setAnimationOptions(QChart::AllAnimations);

下面代码的第一行创建了新的柱状图系列。变量 firstRow 和 rowCount 用于定义自定义模型映射。自定义映射允许仅从模型中获取部分数据。在这种情况下,从索引为 3 的行开始的 5 行数据。以下三行创建QVBarModelMapper类的实例,并指定条形集的数据应从索引为 1 到 4 的模型的列中获取(包括的)。为了在系列和模型之间建立连接,我们将这两个对象都设置为QVBarModelMapper。

最后将系列添加到图表中。

QBarSeries *series = new QBarSeries;int first = 3;int count = 5;QVBarModelMapper *mapper = new QVBarModelMapper(this);mapper->setFirstBarSetColumn(1);mapper->setLastBarSetColumn(4);mapper->setFirstRow(first);mapper->setRowCount(count);mapper->setSeries(series);mapper->setModel(m_model);chart->addSeries(series);

为了在QTableView中显示哪些数据对应于哪个条形集,本示例使用表格着色。当系列添加到图表时,它会根据当前选择的主题分配一种颜色。下面的代码从系列中提取该颜色并使用它来创建彩色QTableView。视图的着色不是QChart功能的一部分。

QString seriesColorHex = "#000000";// get the color of the series and use it for showing the mapped areaQList<QBarSet *> barsets = series->barSets();for (int i = 0; i < barsets.count(); i++) {    seriesColorHex = "#" + QString::number(barsets.at(i)->brush().color().rgb(), 16).right(6).toUpper();    m_model->addMapping(seriesColorHex, QRect(1 + i, first, 1, barsets.at(i)->count()));}

我们希望在图表的轴上放置类别来描述数据的含义。下一个片段展示了如何做到这一点。

QStringList categories;categories << "April" << "May" << "June" << "July" << "August";QBarCategoryAxis *axisX = new QBarCategoryAxis();axisX->append(categories);chart->addAxis(axisX, Qt::AlignBottom);series->attachAxis(axisX);QValueAxis *axisY = new QValueAxis();chart->addAxis(axisY, Qt::AlignLeft);series->attachAxis(axisY);

为了避免设置QGraphicsScene,我们使用QChartView类为我们完成。所述QChart对象指针被用作一个参数QChartView构造函数。为了使渲染看起来更好,打开抗锯齿并设置图表视图小部件的最小尺寸。

QChartView *chartView = new QChartView(chart);chartView->setRenderHint(QPainter::Antialiasing);chartView->setMinimumSize(640, 480);

最后,我们将两个小部件放在一个布局中,并将该布局用作应用程序布局。

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

应用程序已准备就绪。尝试修改表格视图中的数据,看看它如何影响图表。

====================================================

想要了解或购买Qt正版授权的朋友,欢迎咨询官方客服

Qt技术交流群现已开通,QQ搜索群 “765444821”或者扫描下方二维码即可加入

C++界面开发Qt示例:条形图数据

 

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月6日
下一篇 2021年7月6日

相关推荐

发表回复

登录后才能评论