1

我遇到了一些QRubberBand直接来自 Qt 帮助的代码崩溃。崩溃发生在setGeometry通话中。QRubberBand自从我能够使用 qDebug 访问几何图形以来,就创建了该实例,所以我很困惑。

上下文:代码在一个自定义的小部件中,它是这样创建的:

   ImageLabel2* image = new ImageLabel2(this);
   image->setPixmap(pix);
   setCentralWidget(image);

我知道实例仍然存在,因为注释掉setGeometry调用以避免崩溃,调试语句继续输出。

我在做一些明显错误的事情吗?

调试输出:

mousePress QPoint(294,343)
程序意外结束。


从崩溃日志:

异常类型:EXC_BAD_ACCESS (SIGSEGV) 异常代码:0x000000000000000d, 0x0000000000000000


代码:

void ImageLabel2::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "mousePress" << event->pos();

    origin = event->pos();

    if (!rubberBand){
        rubberBand = new QRubberBand(QRubberBand::Rectangle, this); 
    }
    qDebug() <<  rubberBand->geometry();
    rubberBand->setGeometry(QRect(origin, QSize())); // CRASH
    rubberBand->show();
}
4

2 回答 2

2

UPD:根据新信息,问题出在初始化上。

通过检查

if (!rubberBand){
    rubberBand = // initialize it
}

您希望rubberBand指针最初等于零 (NULL),然后检查它。但是除非你初始化了这个指针,否则它既不等于 0 也不等于某个正确的地址。像任何其他未初始化的变量一样,它将包含垃圾,即一些随机值,当时恰好在内存中。使用这样的指针将保证崩溃。

所以,对未初始化的变量说不!如果您希望它最初为 NULL,请将其设为NULL

因此,在您的自定义小部件构造函数中初始化它就像

ImageLabel2::ImageLabel2() : rubberBand(NULL) {
    // your constructor code
}

或者

ImageLabel2::ImageLabel2() {
    rubberBand = NULL;
    // your constructor code
}

(没有区别)。如果您愿意,也可以写0而不是写,但更常见。NULLNULL

之后,不需要对mousePressEvent方法进行任何修改。


旧答案(错误):

QSize 默认构造函数的文档中:

QSize::QSize ()

构造具有无效宽度和高度的大小(即,isValid() 返回 false)。

因此,您创建了一个无效的QSize 并将其传递给 QRect。之后的崩溃可能是 QRect 或 QrubberBand 的代码中的某种错误,或者某种未定义的行为。如果你想要一个 0 x 0 的大小,那么你应该使用 a QSize(0,0),我认为。这样的大小将是有效的:

bool QSize::isValid () 常量

如果宽度和高度都等于或大于 0,则返回 true;否则返回假。

于 2013-08-24T14:03:30.443 回答
0

QSize()您的错误可能来自您传递as 参数的事实。

如文档所述,QSize 的默认构造函数创建了一个无效对象

于 2013-08-24T14:04:01.100 回答