我在为一个大学项目做视频编辑。guiVideoElement (黑区)是视频材料在guiVideoTrack (轻灰色区域)上的图形表示。使用Shift+left鼠标按钮,您可以在guiVideoElement上进行选择(蓝色区域)。若要处理所选内容,可以通过右键单击选定区域打开上下文菜单。

正如本教程中所建议的,我使用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类中引入鼠标按钮处理时,在guiVideoElement本身上处理guiVideoElement之前,我也有过同样的行为。执行下面的代码,同时注释掉contextMenuEvent和mousePressEvent函数,在GuiSelection中打印“右键单击”和parentWidget->GuiSelection()后,程序会崩溃。也就是说,程序在执行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)
{
    ...
}
...知道我做错了什么吗?我在运行Ubuntu11.04。其他运行Windows的团队成员告诉我,程序不会为他们崩溃,选择在左键或右边单击时会消失。对我来说,当我左键点击选择时,什么都不会发生。
发布于 2011-10-19 08:41:26
我的一个队友发现
guiSelection->deleteLater();而不是
delete guiSelection;解决了问题。Qt文档也指向这个方向(例如,请参阅这里和这里)。
发布于 2011-10-16 16:06:57
在跟踪程序崩溃时,确实值得花时间学习如何使用调试器。这将允许您逐步了解程序的代码,并做一些有用的事情,比如查看变量的值。如果程序崩溃,您将能够看到“调用堆栈”(即调用函数的顺序,以到达当前位置)。
https://stackoverflow.com/questions/7784765
复制相似问题