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
。否则,该指针可能包含垃圾,因此不正确,但不等于0rubberBand
在我的自定义小部件头中声明,但直到第一个mouseDown事件(延迟加载)才初始化,因此条件应该触发,但不会触发。如果我在我的类构造函数中显式初始化rubberBand
,那么它将按预期工作。我的意思是,如果你想要延迟加载,你的构造函数必须有一些rubberBand=NULL
赋值,否则指针将有一个未定义的值,指向任何地方。它本身不会像您期望的那样变成NULL
。我会用这个例子更新我的帖子。嘿,谢谢。我当然责怪Qt帮助把我引入歧途;-)