Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建QSector类(使用Qt和QPaint)_C++_Qt_Graph_Draw_Sector - Fatal编程技术网

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

C++ 创建QSector类(使用Qt和QPaint),c++,qt,graph,draw,sector,C++,Qt,Graph,Draw,Sector,我创建了一个类名QSector来绘制一个扇区,如下所示: QValue是一个具有两个属性的类:标签(字符串)和值(双精度) QSector类由4个属性组成,从QWidget继承 画师(画东西) QRect(尺寸和位置) QVector(存储扇区、值和标签的所有数据) Double total(计算QValue值的总和(稍后计算百分比)) 代码如下: // <c++> class QValue { public: QValue(QString a = "", double

我创建了一个类名QSector来绘制一个扇区,如下所示:

QValue是一个具有两个属性的类:标签(字符串)和值(双精度) QSector类由4个属性组成,从QWidget继承

  • 画师(画东西)
  • QRect(尺寸和位置)
  • QVector(存储扇区、值和标签的所有数据)
  • Double total(计算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;
};
//
类QValue
{
公众:
QValue(QString a=”“,double b=0):f_标签(a),f_值(b){}
double value(){return f_value;}
QString label(){return f_label;}
void setValue(双a){f_value=a;}
void setLabel(QString a){f_label=a;}
空集(QString a,double b){f_label=a;f_value=b;}
私人:
QString f_标签;
双f_值;
};
类QSector:公共QWidget
{
Q_对象
公众:
QSector(整数宽度、整数高度、QWidget*父项=0)
:QWidget(父项),f_总计(0)
{
f_rect=新的QRect(1,1,宽度-3,高度-3);
此->调整大小(宽度、高度);
f_油漆=新的油漆工;
}
无效paintEvent(QPaintEvent*event=0)
{
刷子;
设置颜色(QColor(25,25,255));
笔刷设置样式(Qt::SolidPattern);
int startAngle=0;
int spanAngle=0;
f_paint->开始(此);
对于(int i=0;i立根刷(刷子);
//5760=360*16=100%;总计=100%=>值*5760/总计=跨度角
span角度=(5760*f_数据[i].value())/f_总计;
f_paint->drawPie(*f_rect、startAngle、spanAngle);
startAngle=跨距角;
}
f_paint->end();
}
无效添加(QString标签,双值)
{
f_数据。向后推(QValue(标签,值));
f_总计=f_总计+值;
更新();//=>paintEvent();
}
无效添加(QA值)
{
f_数据。向后推(a);
f_总计=f_总计+a.值();
更新();//=>paintEvent();
}
信号:
公众时段:
私人:
QPainter*f_油漆;
QRect*frect;
qf_矢量数据;
双f_总数;
};
一切都在编译

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

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();
}
intmain(intargc,char*argv[])
{
QApplication应用程序(argc、argv);
int w=300;
int h=300;
QSector试验(w,h);
对于(int i=0,n=10;i
程序仅绘制前2个部分并停止(扇区应有10个相等的部分,只有2个)

我不明白它为什么停止画画。如果我把扇形切成两半,效果很好,但从3开始,它只画出2个部分

问题摘要: (图1,扇区划分为1) (图2,扇区划分为2) (图3,划分为3个扇区) (图4,分为10个扇区)

我怀疑

startAngle = spanAngle;
应该是

startAngle += spanAngle;

看起来你只是在同一块馅饼上以相同的角度一遍又一遍地重新喷漆。

谢谢!!我永远不会发现=,=你不应该在开始时用
Q
来命名你的类。除非您正在构建Qt,否则它们可能与Qt的未来更改冲突。