如何初始化QGraphicsItem

时间:2016-10-14 10:22:34

标签: c++ arrays qt segmentation-fault

我使用Qt作为一些gui的东西,我继承了QGraphicsScene来实现我自己的一些方法,我做的一件事是创建一个QGraphicsItems列表,特别是一个对象的2D数组我制作了QGraphicsItem。

MatrixButton **buttons;

然后,当我从QGraphicsScene初始化此方法中的列表时,我遇到了分段错误。

void MatrixScene::initScene()
{
    this->setSceneRect(0, 0, this->width*BUTTON_SIZE, this->height*BUTTON_SIZE);
    this->currentFrameIndex = 0;
    this->color = Qt::red;
    this->buttons = new MatrixButton*[this->height];
    for (int i = 0; i < this->height; i++){
        this->buttons[i] = new MatrixButton[this->width];
    }
    for (int x = 0; x < this->width; x++){
        for (int y = 0; y < this->height; y++){
            this->buttons[x][y].setPos(x*BUTTON_SIZE, y*BUTTON_SIZE); //SEGMENTATION FAULT!!!
            this->addItem(&this->buttons[x][y]);
        }
    }
    this->update();
}

当我调试应用程序时,调试器告诉我问题是由QGraphicsItem.h中的以下行引起的:

inline void QGraphicsItem::setPos(qreal ax, qreal ay)
{ setPos(QPointF(ax, ay)); }

具体而言,根据调试器,ax = 640ay = 0发生故障。在这种情况下,我不明白会导致分段错误的原因。

1 个答案:

答案 0 :(得分:2)

您的问题是您使用x作为行的索引,y作为列的索引,但边界条件正好相反

所以将代码修改为:

for (int x = 0; x < this->height; x++){
        for (int y = 0; y < this->width; y++){
            this->buttons[x][y].setPos(x*BUTTON_SIZE, y*BUTTON_SIZE);        
            this->addItem(&this->buttons[x][y]);
        }
    }