写一个cpp算法函数, 支持QColor 转换为 QVector4D, QVector4D中的值区间为0-1
时间: 2023-05-26 20:02:32 浏览: 158
下面是一个cpp算法函数,支持将QColor 转换为 QVector4D,并且将QVector4D中的值区间限制在0-1之间:
```cpp
QVector4D colorToVector4D(const QColor& color) {
float r = color.red() / 255.0f;
float g = color.green() / 255.0f;
float b = color.blue() / 255.0f;
float a = color.alpha() / 255.0f;
return QVector4D(r, g, b, a).normalized();
}
```
首先将QColor中的RGBA值分别除以255.0f,将其范围限制在0-1之间。然后,使用QVector4D(r, g, b, a)构造函数创建一个四元组,并调用其normalized()方法将其标准化,确保其长度为1,未超出范围。最后,将QVector4D返回作为结果。
相关问题
写一个cpp算法函数, 支持QColor 转换为 QVector4D
#include <QVector4D>
#include <QColor>
QVector4D QColorToVector4D(const QColor& color)
{
QVector4D vector;
vector.setX(color.redF());
vector.setY(color.greenF());
vector.setZ(color.blueF());
vector.setW(color.alphaF());
return vector;
}
// 使用方法
QColor color(255, 0, 0, 127);
QVector4D vector = QColorToVector4D(color); // 将QColor转换为QVector4D
float red = vector.x(); // 获取红色分量
float green = vector.y(); // 获取绿色分量
float blue = vector.z(); // 获取蓝色分量
float alpha = vector.w(); // 获取透明度分量
优化一下这段代码: // 取出数据 QVector<double> qVector_X, qVector_Y; for (const auto& element : inferHeatDatas) { qVector_X.append(element.distance); qVector_Y.append(element.rock_type); } QCustomPlot* TypeCustom = new QCustomPlot(); TypeCustom = ui->widget_type_curve; TypeCustom->legend->setVisible(true); TypeCustom->legend->setFont(QFont("Helvetica", 9)); QPen pen; pen.setColor(QColor(qSin(4*1+1.2)*80+80, qSin(4*0.3+0)*80+80, qSin(4*0.3+1.5)*80+80)); TypeCustom->addGraph(); TypeCustom->graph()->setPen(pen); TypeCustom->graph()->setName("123"); TypeCustom->graph()->setLineStyle(QCPGraph::lsStepCenter); TypeCustom->graph()->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 5)); TypeCustom->graph()->setData(qVector_X, qVector_Y); TypeCustom->graph()->rescaleAxes(true); TypeCustom->yAxis->scaleRange(1.1, TypeCustom->yAxis->range().center()); TypeCustom->xAxis->scaleRange(1.1, TypeCustom->xAxis->range().center()); TypeCustom->xAxis->setTicks(false); TypeCustom->yAxis->setTicks(true); TypeCustom->xAxis->setTickLabels(false); TypeCustom->yAxis->setTickLabels(true); TypeCustom->axisRect()->setupFullAxesBox(); TypeCustom->replot();
这段代码可以进行以下优化:
1. 重复使用`ui->widget_type_curve`而不是创建新的`QCustomPlot`对象:
```cpp
QCustomPlot* TypeCustom = ui->widget_type_curve;
```
将`ui->widget_type_curve`赋值给`TypeCustom`,避免创建多余的对象。
2. 设置图例的字体和可见性:
```cpp
TypeCustom->legend->setFont(QFont("Helvetica", 9));
TypeCustom->legend->setVisible(true);
```
3. 使用链式调用来设置曲线图的属性:
```cpp
TypeCustom->addGraph()->setPen(pen)->setName("123")->setLineStyle(QCPGraph::lsStepCenter)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 5))->setData(qVector_X, qVector_Y)->rescaleAxes(true);
```
将多个属性设置放在一行代码中,使用链式调用来设置。
4. 使用`scaleRange`一次性调整坐标轴的范围:
```cpp
TypeCustom->yAxis->scaleRange(1.1, TypeCustom->yAxis->range().center());
TypeCustom->xAxis->scaleRange(1.1, TypeCustom->xAxis->range().center());
```
5. 使用`setTicks`和`setTickLabels`一次性设置坐标轴刻度和标签的可见性:
```cpp
TypeCustom->xAxis->setTicks(false);
TypeCustom->yAxis->setTicks(true);
TypeCustom->xAxis->setTickLabels(false);
TypeCustom->yAxis->setTickLabels(true);
```
6. 调用`setupFullAxesBox`和`replot`来完成图形的设置和重绘:
```cpp
TypeCustom->axisRect()->setupFullAxesBox();
TypeCustom->replot();
```
这些优化可以使代码更简洁、可读性更高,并减少不必要的操作。最终的优化代码如下所示:
```cpp
QVector<double> qVector_X, qVector_Y;
for (const auto& element : inferHeatDatas)
{
qVector_X.append(element.distance);
qVector_Y.append(element.rock_type);
}
QCustomPlot* TypeCustom = ui->widget_type_curve;
TypeCustom->legend->setVisible(true);
TypeCustom->legend->setFont(QFont("Helvetica", 9));
QPen pen;
pen.setColor(QColor(qSin(4*1+1.2)*80+80, qSin(4*0.3+0)*80+80, qSin(4*0.3+1.5)*80+80));
TypeCustom->addGraph()->setPen(pen)->setName("123")->setLineStyle(QCPGraph::lsStepCenter)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 5))->setData(qVector_X, qVector_Y)->rescaleAxes(true);
TypeCustom->yAxis->scaleRange(1.1, TypeCustom->yAxis->range().center());
TypeCustom->xAxis->scaleRange(1.1, TypeCustom->xAxis->range().center());
TypeCustom->xAxis->setTicks(false);
TypeCustom->yAxis->setTicks(true);
TypeCustom->xAxis->setTickLabels(false);
TypeCustom->yAxis->setTickLabels(true);
TypeCustom->axisRect()->setupFullAxesBox();
TypeCustom->replot();
```
阅读全文