07-三维柱状图属性设置
10.2.4 三维柱状图属性设置
图10-5左侧的控制面板用于图表的操作和一些常用属性的设置。
1.预设视角
3种三维图表的父类QAbstract3DGraph有一个函数scene()可以获得图表的场景,是一个Q3DScene类。Q3DScene是三维图的场景,包含一个相机(camera)和一个光源,还提供一个3D主视口(viewport)和两个2D副视口(subviewport),其中次级2D副视口用于显示二维切片图。
场景的相机位置就是我们看图表的视角,当旋转一个图表时,实际上就是相机位置的变化,Qt为相机提供了一些预设的视角,由枚举类型Q3DCamera::CameraPreset定义,它有二十多种取值,其中几种是:
- Q3DCamera::CameraPresetFrontLow,前下方;
- Q3DCamera::CameraPresetFront,正前方;
- Q3DCamera::CameraPresetFrontHigh,前上方;
- Q3DCamera::CameraPresetLeft,左侧。
在控制面板的“预设视角”的下拉列表框中列出了所有视角取值,为currentIndexChanged()信号编写槽函数代码如下:
void MainWindow::on_comboCamera_currentIndexChanged(int index)
{ //变换视角
Q3DCamera::CameraPreset cameraPos=Q3DCamera::CameraPreset(index);
graph3D->scene()->activeCamera()->setCameraPreset(cameraPos);
}
通过graph3D->scene()->activeCamera()获取图表视图当前的相机,是一个Q3DCamera类型的对象,然后调用其setCameraPreset()函数设置预设的视角。因为列表框中的选项是完全按照枚举类型Q3DCamera::CameraPreset的取值顺序排列的,所以,只需将其序号转换为Q3DCamera::Camera Preset类型即可。
2.旋转和缩放
在程序运行时,在图表上滚动鼠标滚轮就可以缩放,按住鼠标右键上下左右移动可以对图表进行三维旋转。图表的旋转和缩放是通过改变图表场景的相机的位置和缩放系数来实现的。
控制面板上有3个QSlider组件分别用于水平旋转、垂直旋转和缩放。3个QSlider组件的valueChanged(int value)信号的响应代码相同,代码如下:
void MainWindow::on_sliderH_valueChanged(int value)
{
Q_UNUSED(value);
int xRot =ui->sliderH->value();//水平
int yRot=ui->sliderV->value(); //垂直
int zoom=ui->sliderZoom->value(); //缩放
graph3D->scene()->activeCamera()->setCameraPosition(xRot, yRot,zoom);
}
Q3DCamera类的setCameraPosition()函数用于设置相机的位置和缩放系数,setCameraPosition()函数的原型定义是:
void Q3DCamera::setCameraPosition(float horizontal, float vertical, float zoom = 100.0f)
其中,horizontal是水平旋转角度,在-180°至+180°之间取值,所以sliderH的取值范围设置为-180至+180;vertical是垂直方向旋转角度,在0至90°之间取值,所以sliderV的取值范围设置为0至90;zoom是缩放系数,缺省值为100,表示无缩放,sliderZoom的取值范围设置为10至500,小于100是缩小,大于100是放大。
setCameraPosition()函数同时定义了相机的位置和缩放,所以3个QSlider组件的valueChanged (int value)信号响应代码相同。
3.主题
与QChart一样,QAbstract3DGraph类可以设置主题,主题定义了图表的各种颜色和外观设置。通过activeTheme()可以获取图表当前设置的主题,通过setActiveTheme()函数可以设置新的主题。
用于三维图表的主题类是Q3DTheme,其type()属性表示主题类型。主题类型是一个枚举类型Q3DTheme::Theme,有多种取值,与QChart的主题的枚举类型的取值类似。
控制面板上的“主题”下拉列表框中列出了所有可选的主题,为其currentIndexChanged(int index)信号编写响应槽函数,代码如下:
void MainWindow::on_cBoxTheme_currentIndexChanged(int index)
{//设置主题
Q3DTheme *currentTheme = graph3D->activeTheme();
currentTheme->setType(Q3DTheme::Theme(index));
}
图表的一些显示属性的设置是通过设置activeTheme()主题的属性来实现的,例如控制面板上的“显示背景”复选框的代码如下:
void MainWindow::on_chkBoxBackground_clicked(bool checked)
{//图表的背景
graph3D->activeTheme()->setBackgroundEnabled(checked);
}
“显示背景网格”复选框的代码如下:
void MainWindow::on_chkBoxGrid_clicked(bool checked)
{ //图表的网格
graph3D->activeTheme()->setGridEnabled(checked);
}
“坐标轴标签背景可见”的复选框的代码如下:
void MainWindow::on_chkBoxAxisBackground_clicked(bool checked)
{//轴标签背景
graph3D->activeTheme()->setLabelBackgroundEnabled(checked);
}
4.选择模式
“选择模式”指的是鼠标在图表上单击时,项被选择的模式,缺省为选择一个项。QAbstract3DGraph类的setSelectionMode()函数用于设置选择模式,选择模式是枚举类型QAbstract3DGraph::SelectionFlag,其取值常量见表10-1。
| 枚举常量 | 意义 | | :----- | :----- | :----- | :----- | | SelectionNone | 不允许选择 | | SelectionItem | 选择并且高亮度显示一个项 | | SelectionRow | 选择并且高亮度显示一行 | | SelectionItemAndRow | 选择一个项和一行,用不同颜色高亮显示 | | SelectionColumn | 选择并且高亮度显示一列 | | SelectionItemAndColumn | 选择一个项和一列,用不同颜色高亮显示 | | SelectionRowAndColumn | 选择交叉的一行和一列 | | SelectionItemRowAndColumn | 选择交叉的一行和一列,用不同颜色高亮显示 | | SelectionSlice | 切片选择,需要与SelectionRow或SelectionColumn结合使用 | | SelectionMultiSeries | 选中同一个位置处的多个序列的项 |
控制面板的“选择模式”下拉列表框中列出了除SelectionMultiSeries之外的其他所有选择模式,其currentIndexChanged(int index)信号的槽函数代码如下:
void MainWindow::on_cBoxSelectionMode_currentIndexChanged(int index)
{//选择模式
graph3D->setSelectionMode(QAbstract3DGraph::SelectionFlags(index));
}
5.序列相关的设置
Q3DBars只能显示QBar3DSeries序列,QBar3DSeries、QScatter3Dseries和QSurface3DSeries都继承自QAbstract3DSeries(见图10-2)。
序列的设置主要是对其一些显示属性的设置,QAbstract3DSeries类的主要函数见表10-2(省略了函数参数中的const关键字)。一个设置函数一般对应一个读取函数,如setBaseColor()用于设置序列基本颜色,对应的读取序列基本颜色的函数是baseColor(),表中仅列出设置函数。
| 函数原型 | 功能描述 | | :----- | :----- | :----- | :----- | | void setBaseColor(QColor &color) | 设置序列基本颜色 | | void setBaseGradient(QLinearGradient &gradient) | 设置序列渐变色 | | void setColorStyle(Q3DTheme::ColorStyle style) | 设置序列颜色类型 | | void setMesh(Mesh mesh) | 设置棒图项的样式,参数是QAbstract3DSeries::Mesh枚举类型,定义棒图是棱柱、圆柱、圆锥形等 | | void setMeshSmooth(bool enable) | 设置棒图是否有光滑效果 | | void setMeshRotation(QQuaternion &rotation) | 设置所有项的旋转角度 | | void setItemLabelVisible(bool visible) | 设置项的标签是否可见,若为True,则选中一个项时会显示其标签 | | void setName(QString &name) | 设置序列的名称,标记符号“@seriesName”可用于项的标签格式定义中 | | void setVisible(bool visible) | 设置序列是否可见 | | void setItemLabelFormat(QString &format) | 设置选中项的标签文字格式 |
窗口控制面板中的“棒图样式”下拉列表框列出了QAbstract3DSeries::Mesh枚举类型的各种取值,用于设置棒图的样式,如:
- QAbstract3DSeries::MeshBar,棱柱;
- QAbstract3DSeries::MeshCylinder,圆柱;
- QAbstract3DSeries::MeshSphere,椭圆。
还有一些其他取值,其详细描述见Qt的帮助文件。
“棒图样式”下拉列表框的currentIndexChanged(int index)信号的槽函数代码如下:
void MainWindow::on_cBoxBarStyle_currentIndexChanged(int index)
{ //棒图的样式
QAbstract3DSeries::Mesh aMesh;
aMesh=QAbstract3DSeries::Mesh(index+1);
series->setMesh(aMesh);
}
“项的标签可见”复选框的响应代码如下:
void MainWindow::on_chkBoxItemLabel_clicked(bool checked)
{ //项的标签是否可见
series->setItemLabelFormat("value at (@rowLabel,@colLabel): %.1f");
series->setItemLabelVisible(checked);
}
这里使用了setItemLabelFormat()函数设置项的标签显示文字的格式,在格式设置中,可以使用一些标记符号,见表10-3。
| 标记符号 | 意义 |
| :----- | :----- | :----- | :----- |
| @rowTitle | 行坐标轴的标题 |
| @colTitle | 列坐标轴的标题 |
| @valueTitle | 数值坐标轴的标题 |
| @rowIdx | 可见的行索引号 |
| @colIdx | 可见的列索引号 |
| @rowLabel | 项所在的行坐标的文字标签 |
| @colLabel | 项所在的列坐标的文字标签 |
| @valueLabel | 项的数值,显示格式与QValue3DAxis::labelFormat 格式相同 |
| @seriesName | 序列名称 |
| %
6.坐标轴反向
在图10-5的三维柱状图中,垂直方向是数值坐标轴,缺省的方向是向上为正。如果实际情况需要数值坐标轴反向,可以调用QValue3DAxis::setReversed()函数将坐标轴设置为反向。控制面板上的“数值坐标轴反向”复选框的槽函数代码如下:
void MainWindow::on_chkBoxReverse_clicked(bool checked)
{//数值轴反向
graph3D->valueAxis()->setReversed(checked);
}