gpt4 book ai didi

c++ - 创建 QSector 类(使用 Qt 和 QPaint)

转载 作者:行者123 更新时间:2023-11-28 07:26:59 25 4
gpt4 key购买 nike

我创建了一个类名 QSector 来绘制如下扇区: http://www.philadelphia-reflections.com/images/GDP_Composition_By_Sector_Graph.jpg

QValue 是一个具有 2 个属性 Label (String) 和 Value (double) 的类QSector类由4个属性组成,继承自QWidget

  • QPainter(画东西)
  • QRect(大小和位置)
  • QVector(存储扇区、值和标签的所有数据)
  • 双重总计(计算 QValue 值的总和(稍后计算百分比))

这是代码::

// <c++>
class QValue
{
public:
QValue(QString a = "", double b = 0): f_label(a), f_value(b) {}

double value() { return f_value; }
QString label() { return f_label; }

void setValue(double a) { f_value = a; }
void setLabel(QString a) { f_label = a; }

void set(QString a, double b) { f_label = a; f_value = b; }

private:
QString f_label;
double f_value;
};

class QSector : public QWidget
{
Q_OBJECT

public:
QSector(int width, int height, QWidget *parent = 0)
: QWidget(parent), f_total(0)
{
f_rect = new QRect(1, 1, width - 3 , height - 3);
this->resize(width, height);
f_paint = new QPainter;
}

void paintEvent(QPaintEvent* event = 0)
{
QBrush brush;

brush.setColor(QColor(25, 25, 255));
brush.setStyle(Qt::SolidPattern);

int startAngle = 0;
int spanAngle = 0;

f_paint->begin(this);

for (int i = 0; i < f_data.size(); i++)
{
int c = ( i * 150) % 255;
brush.setColor(QColor(c, 25, 255));
f_paint->setBrush(brush);
// 5760 = 360 * 16 = 100%; total = 100% => Value * 5760 / total = span angle
spanAngle = (5760 * f_data[i].value()) / f_total;

f_paint->drawPie(*f_rect, startAngle, spanAngle);

startAngle = spanAngle;
}

f_paint->end();
}

void add(QString Label, double Value)
{
f_data.push_back(QValue(Label, Value));
f_total = f_total + Value;

update(); // => paintEvent();
}

void add(QValue a)
{
f_data.push_back(a);
f_total = f_total + a.value();

update(); // => paintEvent();
}

signals:

public slots:

private:
QPainter *f_paint;
QRect *f_rect;

QVector<QValue> f_data;
double f_total;
};

编译一切。

当我这样做的时候问题就来了::

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

int w = 300;
int h = 300;

QSector test(w, h);

for (int i = 0, n = 10; i < n; i++)
test.add("", 10);

test.show();

return app.exec();
}

程序只绘制前 2 个部分并停止(该扇区应该有 10 个相等的部分,但只有 2 个)

我不明白为什么它停止绘制。如果我将该扇区一分为二,它工作正常,但从 3 开始,它只绘制 2 个部分

问题总结:http://i.imgur.com/Mssjisd.png(图 1,扇区分为 1)(图 2,扇区一分为二)(图 3,扇区分为 3)(图 4,扇区分为 10)

最佳答案

我怀疑

startAngle = spanAngle;

应该是

startAngle += spanAngle;

看起来您只是以相同的角度一遍又一遍地在同一个饼图上重新绘制。

关于c++ - 创建 QSector 类(使用 Qt 和 QPaint),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18595694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com