Информация о геометрии QRubberBand, предоставляющая SIGSEGV - PullRequest
0 голосов
/ 28 февраля 2019

Я разрабатываю приложение Qt с использованием Qt Creator.Как часть приложения, я должен быть в состоянии получить информацию о положении, высоте и ширине 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.

Итак, вот мои вопросы:

  • Почему это происходит?
  • Можно ли достичь моей цели, немного отредактировав код?
  • Что мне делать, чтобы получить то, что я хочу?

Я знаю, что совершил глупую ошибку, но пока не нашел ее.Не стесняйтесь комментировать, если вы хотите получить больше информации по этому вопросу.

1 Ответ

0 голосов
/ 28 февраля 2019

Исходя из кода и комментариев, вы предполагаете, что элемент rubberBand будет автоматически инициализирован на nullptr.Тем не менее, он фактически неинициализирован, поэтому следующее ...

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

приводит к неопределенному поведению.

Измените ваш конструктор Widget, чтобы включить явную инициализацию ...

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

Еще лучше, просто сделайте rubberBand элемент без указателя ...

QRubberBand rubberBand;

и инициализируйте его в конструкторе с помощью ...

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