我正在使用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
。
这是我的问题:
我知道我犯了一个愚蠢的错误,但是我还没有发现。如果您想获得有关该问题的更多信息,请随时发表评论。
答案 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)
{
...
}