Создание класса QSector (с использованием Qt и QPaint)

Я создал имя класса 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, он рисует только две части

Краткое изложение проблемы: http://i.imgur.com/Mssjisd.png
(изображение 1, сектор разделен на 1)
(изображение 2, сектор разделен на 2)
(изображение 3, сектор разделен на 3)
(изображение 4, сектор разделен на 10)

0

Решение

Я подозреваю что

startAngle = spanAngle;

должно быть

startAngle += spanAngle;

Похоже, вы просто перерисовываете один и тот же кусок пирога снова и снова под одним и тем же углом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]