Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QRubberBand:由于访问错误而崩溃_Qt - Fatal编程技术网

Qt QRubberBand:由于访问错误而崩溃

Qt QRubberBand:由于访问错误而崩溃,qt,Qt,我得到了一个崩溃的一些QRubberBand代码是直接从Qt帮助。崩溃发生在调用setGeometry时。QRubberBand实例已经创建,因为我可以使用qDebug访问几何体,所以我很困惑 上下文:代码位于自定义小部件中,该小部件的创建方式如下: ImageLabel2* image = new ImageLabel2(this); image->setPixmap(pix); setCentralWidget(image); 我知道该实例仍然存在,因为注释掉set

我得到了一个崩溃的一些
QRubberBand
代码是直接从Qt帮助。崩溃发生在调用
setGeometry
时。
QRubberBand
实例已经创建,因为我可以使用qDebug访问几何体,所以我很困惑

上下文:代码位于自定义小部件中,该小部件的创建方式如下:

   ImageLabel2* image = new ImageLabel2(this);
   image->setPixmap(pix);
   setCentralWidget(image);
我知道该实例仍然存在,因为注释掉
setGeometry
调用以避免崩溃,调试语句将继续输出

我是不是做错了什么

调试输出:

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();
}
鼠标按QPoint(294343)
程序意外地完成了


来自崩溃日志:

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();
}
异常类型:EXC\U坏访问(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();
}
void ImageLabel2::MousePresseEvent(QMouseEvent*事件)
{
qDebug()位置();
如果(!橡胶带){
rubberBand=新的QRubberBand(QRubberBand::Rectangle,this);
}
qDebug()几何体();
rubberBand->setGeometry(QRect(origin,QSize());//崩溃
橡皮键->显示();
}

UPD:根据新信息,问题在于初始化

通过支票

if(!rubberBand){
rubberBand=//初始化它
}
您希望rubberBand指针最初等于零(NULL),然后检查它。但除非初始化此指针,否则它既不等于0,也不等于某个正确的地址。与任何其他未初始化的变量一样,它将包含垃圾,即此时内存中碰巧存在的某个随机值。使用这样的指针将保证崩溃

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

因此,在自定义小部件构造函数中,将其初始化为

ImageLabel2::ImageLabel2():橡皮键(NULL){
//您的构造函数代码
}

ImageLabel2::ImageLabel2(){
rubberBand=NULL;
//您的构造函数代码
}
(没有区别)。如果愿意,也可以编写
0
而不是
NULL
,但是
NULL
更常见

之后,
mousePressEvent
方法不需要修改


旧答案(错):

从以下文件中:

QSize::QSize()

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

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

boolqsize::isValid()常量

如果宽度和高度均等于或大于0,则返回true;否则返回false


您的错误可能是因为您将
QSize()
作为参数传递


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

谢谢-我已经检查过了,并尝试使用
QRubberBand::setGeometry(int x,int y,int width,int height)
,但出现了相同的崩溃。我已经将其缩小到了条件
if(!rubberBand)
从未被输入,因此对象从未被创建。奇数。然后检查构造函数中的
rubberBand
字段是否初始化为
NULL
。否则,该指针可能包含垃圾,因此不正确,但不等于0
rubberBand
在我的自定义小部件头中声明,但直到第一个mouseDown事件(延迟加载)才初始化,因此条件应该触发,但不会触发。如果我在我的类构造函数中显式初始化
rubberBand
,那么它将按预期工作。我的意思是,如果你想要延迟加载,你的构造函数必须有一些
rubberBand=NULL
赋值,否则指针将有一个未定义的值,指向任何地方。它本身不会像您期望的那样变成
NULL
。我会用这个例子更新我的帖子。嘿,谢谢。我当然责怪Qt帮助把我引入歧途;-)