我正在为大学项目制作视频编辑器。 guiVideoElement(黑色区域)是guiVideoTrack(浅灰色区域)上视频材料的图形表示。使用Shift +鼠标左键,您可以在guiVideoElement上进行选择(蓝色区域)。要使用选择,您可以通过右键单击所选区域来打开上下文菜单。
正如this tutorial中所建议的,我使用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) { }
在guiVideoElement本身处理mousePressEvents时,在GuiSelection类中引入鼠标按钮处理之前,我有相同的行为。在GuiSelection中注释掉contextMenuEvent和mousePressEvent函数时执行下面的代码将使程序在打印“右键单击”和parentWidget-&gt; 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的其他团队成员告诉我程序不会崩溃,只需向左或向右单击它就会消失。对我来说,当我左键单击选择时,根本没有任何事情发生。