Программа Qt вылетает при щелчке правой кнопкой мыши - PullRequest
1 голос
/ 16 октября 2011

Я работаю над видеоредактором для университетского проекта.Элемент guiVideoElement (черная область) - это графическое представление видеоматериала в guiVideoTrack (светло-серая область).С помощью Shift + левая кнопка мыши вы можете сделать выделение (синяя область) на элементе guiVideoElementЧтобы работать с выделением, вы можете открыть контекстное меню, щелкнув правой кнопкой мыши по выбранной области.

video track with element and selection

Как указано в в этом уроке , я используюcontextMenuEvent, чтобы открыть контекстное меню.К сожалению, вся программа вылетает с сообщением «Программа неожиданно завершилась», если только я не определил mousePressEvent.Это помогает, даже если метод mousePressEvent пуст (см. Ниже).

Вот мой код для выбора:

#include "guiselection.h"

#include <QMouseEvent>
#include <QMenu>
#include <QDebug>

GuiSelection::GuiSelection(QWidget *parent, int pos) :
    QLabel(parent)
{
    this->setFixedSize(1,60);
    this->setScaledContents(true);
    this->setPixmap(QPixmap(":/track/gui_selection"));

    this->move(pos, this->pos().y());
    this->show();
}

void GuiSelection::contextMenuEvent(QContextMenuEvent *ev)
{
    QMenu menu(this);

    exampleAct = new QAction(tr("&cut"), this);
    connect(exampleAct, SIGNAL(triggered()), this, SLOT(doSth()));
    menu.addAction(exampleAct);

    menu.exec(ev->globalPos());
}

void GuiSelection::doSth()
{
    qDebug() << "do sth executed";
}

void GuiSelection::mousePressEvent(QMouseEvent *ev) { }

У меня было такое же поведение перед введением обработки кнопок мыши в GuiSelectionкласс при обработке mousePressEvents для самого guiVideoElement.Выполнение приведенного ниже кода при комментировании функций contextMenuEvent и mousePressEvent в GuiSelection приведет к аварийному завершению программы после печати «нажатой правой кнопкой мыши» и parentWidget-> width ().Т.е. программа вылетает после , выполнив весь код в функции mousePressEvent.

#include "guivideoelement.h"
#include "tracks/videoelement.h"
#include "uitracks/guiselection.h"
#include "uitracks/guivideotrack.h"

#include <QPixmap>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QApplication>

#include <QDebug>

GuiVideoElement::GuiVideoElement(GuiVideoTrack *parent, VideoElement *ve, int length) :
    GuiTrackElement(parent)
{
    ...
}

void GuiVideoElement::mousePressEvent(QMouseEvent *ev)
{
    if(guiSelection != NULL) {
        delete guiSelection;
        guiSelection = NULL;
    }

    if(ev->button() & Qt::LeftButton && QApplication::keyboardModifiers() & Qt::ShiftModifier)
    {
        guiSelection = new GuiSelection(this, ev->pos().x());
    } else if(ev->button() & Qt::RightButton)
    {
        qDebug() << "right button clicked";
    }
    else {
        lastX = this->pos().x();
        lastStableX = this->pos().x();

        // for exact distinction of position us global positions!
        prevMousePos = mapFromGlobal(ev->globalPos()).x();
    }
    qDebug() << parentWidget->width();
}

void GuiVideoElement::mouseMoveEvent(QMouseEvent *ev)
{
    ...
}

...

Есть идеи, что я делаю неправильно?Я использую Ubuntu 11.04.Другие члены команды, которые запускают Windows, говорят мне, что программа не падает для них, выбор просто исчезает при нажатии на него влево или вправо.Для меня, когда я щелкаю левой кнопкой мыши на выделении, ничего не происходит вообще.

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Мой товарищ по команде обнаружил, что используя

guiSelection->deleteLater();

вместо

delete guiSelection;

решает проблему. Документы Qt также указывают на это направление (например, см. здесь и здесь ).

0 голосов
/ 16 октября 2011

При отслеживании сбоев программы действительно стоит потратить время на то, чтобы узнать, как использовать отладчик .Это позволит вам шагать по коду программы и делать полезные вещи, такие как просмотр значений переменных.А в случае сбоя программы вы сможете увидеть «стек вызовов» (то есть порядок, в котором были вызваны функции, чтобы добраться до текущего местоположения).

...