【问题标题】:Geometry information of QRubberBand giving SIGSEGVQRubberBand 的几何信息给 SIGSEGV
【发布时间】:2019-02-28 14:38:50
【问题描述】:

我正在使用 Qt Creator 设计一个 Qt 应用程序。作为应用程序的一部分,我需要能够在hide() 之前获得QRubberBand 的位置、高度和宽度信息。为此,我尝试使用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

所以这是我的问题:

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

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

【问题讨论】:

  • 您是否在Widget 构造函数中将rubberBand 初始化为nullptr
  • @G.M.不,我还没做呢
  • @G.M.感谢您的帮助,我已经完成了,现在可以使用了。

标签: qt segmentation-fault


【解决方案1】:

从代码和 cmets 看来,您似乎假设 rubberBand 成员将自动初始化为 nullptr。但是,它实际上是未初始化的,使以下...

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

导致未定义的行为。

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

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

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

QRubberBand rubberBand;

并在构造函数中初始化它...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2011-05-23
    • 2016-12-20
    • 2013-12-25
    相关资源
    最近更新 更多