QRubberBand提供SIGSEGV的几何信息

时间:2019-02-28 14:38:51

标签: qt sigsegv

我正在使用Qt Creator设计Qt应用程序。作为应用程序的一部分,我需要能够在QRubberBand之前获取hide()的位置,高度和宽度信息。为此,我尝试使用QRubberBand文档中给出的以下逻辑:

void Widget::mousePressEvent(QMouseEvent *event)
{
    origin = event->pos();
    if (!rubberBand)
        rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
    rubberBand->setGeometry(QRect(origin, QSize()));
    rubberBand->show();
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    rubberBand->setGeometry(QRect(origin, event->pos()).normalized());
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    rubberBand->hide();
    // determine selection, for example using QRect::intersects()
    // and QRect::contains().
}

并在头文件的私有部分中按以下方式定义rubberBand:

QRubberBand *rubberBand;

这样做之后效果很好。要进行下一步,我还定义了以下整数(标头的私有部分):

int rubX;
int rubY;
int rubWidth;
int rubHeight;

然后我试图在rubberBand中隐藏mouseReleaseEvent之前获取几何信息,类似于以下内容:

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    rubX = rubberBand->x();
    rubY = rubberBand->y();
    rubHeight = rubberBand->height();
    rubWidth = rubberBand->width();        
    rubberBand->hide();
}

添加这些代码后,程序将运行,但是当我尝试绘制rubberBand时,程序崩溃,给出SIGSEGV

这是我的问题:

  • 为什么会这样?
  • 是否可以通过稍微编辑代码来实现我的目标?
  • 我应该怎么做才能得到自己想要的东西?

我知道我犯了一个愚蠢的错误,但是我还没有发现。如果您想获得有关该问题的更多信息,请随时发表评论。

1 个答案:

答案 0 :(得分:2)

根据代码和注释,您似乎在假设rubberBand成员将自动初始化为nullptr。但是,实际上它尚未初始化,因此...

if (!rubberBand)
    rubberBand = new QRubberBand(QRubberBand::Rectangle, this);

导致不确定的行为。

更改您的Widget构造函数以包括显式初始化...

Widget::Widget ()
    : rubberBand(nullptr)
{
    ...
}

更妙的是,只需将rubberBand设为非指针成员...

QRubberBand rubberBand;

并使用...在构造函数中对其进行初始化

Widget::Widget ()
    : rubberBand(QRubberBand::Rectangle, this)
{
    ...
}