QPolygon的Qt结构

时间:2016-08-30 13:20:18

标签: c++ qt qpolygon

我有这个结构:

typedef struct {
    QPolygon polygon;
    QRect position;
} form;

我尝试初始化forms,如下所示,但我得到了分段错误错误:

int n = 10
forms = (form*) malloc(sizeof(form) * n);
while (n>0) {
   forms[n].position.setRect(0,0,0,0);
   forms[n].polygon=QPolygon(0); //error - segmentation fault
   forms[n].polygon = QPolygon(QRect(x, y, w, h)); //error - segmentation fault
}

我也是这样尝试的:

QPolygon v;
v = QPolygon(QRect(x, y, w, h)); //ok
v = QPolygon(QRect(x, y, w, h)); //ok
sprites[n].polygon = QPolygon(QRect(x, y, w, h)); //error - segmentation fault

如何将多边形添加到结构中?

2 个答案:

答案 0 :(得分:1)

首先,在C ++中定义你的结构:

struct form { // note: Qt naming convention would use upper case first letter
    QPolygon polygon;
    QRect position;
};

在这个答案的最后有一个更现代的选择,但首先,要直接修复你20岁的C ++样式,写这样的代码(你不应该这样,但只是你知道怎么做它):

为此,我们假设你有

form *forms;

然后你可以让你的代码不会崩溃,如果你这样写的话:

int n = 10
forms = new form[n]; // bad style in modern C++, use std::vector instead
while (n > 0) {
   --n; // indexes go 9..0
   //forms[n].position.setRect(0,0,0,0); // constructor did this
   //forms[n].polygon=QPolygon(0); // constructor did this
   forms[n].polygon = QPolygon(QRect(x, y, w, h));
}

您的错误可能,因为QPolygon结构中的QRectform个实例未正确构建。很难说,你所做的是未定义的行为,访问未初始化的内存。此外,您在循环的第一次迭代中有n==10,它在有效索引范围0..9之外,可能已经崩溃。

此外,当您使用new分配数组时,必须也将其作为数组删除,以便数组元素被正确销毁:

delete[] forms;

使用现代C ++,您不需要这样做,您可以使用值类型或智能指针。

最后,一个更现代的版本,只是更容易和更安全,你不必担心释放内存等:

std::vector<form> forms;


int n = 10
forms = std::vector<form>(n); // assign a vector of length n to forms


while (n > 0) {
    ... contents of the loop are same as above ...
}

答案 1 :(得分:1)

由于您正在编写C ++ 11而不是C,因此您的代码应该更简单。利用您正在使用的语言。

emplace_back在向量中构建Form实例:它是最快的方法。你也可以使用push_back,但这构成了一个不便于移动的临时性。

struct Form {
    QPolygon polygon;
    QPoint position; // maybe you meant QRect boundingRect?
    Form(const QPolygon & polygon, const QPoint & position) :
        polygon{polygon}, position{position} {}
    Form() = default;
};

class Class {
    std::vector<Form> forms;
public:
    Class() {
        int x = 0;
        int y = 0;
        int w = 100;
        int h = 100;
        forms.reserve(20); // avoids copies as the vector grows
        for (int i = 0; i < 10; ++i)
            forms.emplace_back(QRect{x,y,w,h}, QPoint{x,y});
        for (int i = 0; i < 10; ++i)
            forms.push_back({QRect{x,y,w,h}, {x,y}}); // uniform initialization
    }
};