如何在类中实现 mousePressEvent (QMouseEvent * event)?

问题描述

美好的一天。 处理 QMouseEvent。 用自己的类做了一个项目,实现了一个基于QMovie的播放器。

#ifndef QTUBE_H
#define QTUBE_H
#include <QMovie>
#include <QLabel>
#include <QMouseEvent>
 
class QNewScene;
 
class QTube : public QWidget
{
    Q_OBJECT
public:
    QTube();
    QTube(QNewScene *scene,QString videourl,double x,double y,int speed);
    void qStop(); //остановка проигрывателя
    void qPlay(); //запуск проигрывателя
    void qToFrane(int frameNumber); //rewind video to the beginning
 
public slots:
    void qMovieEnd();
signals:
    void qTubeFinished();
 
private:
    QNewScene *newscene;
    QLabel *qlbl;
    QGraphicsProxyWidget* qvideoplayer;
    QTransform transformvideo;
    QMovie *qtopclip;
    int frame;  //frame number
    bool isOver; //truth when the video is over
    void mousePressEvent(QMouseEvent *event); //right mouse button to open the context menu
 
};
#endif // QTUBE_H

和实施

#include "qtube.h"
#include "qnewscene.h"
#include <QGraphicsProxyWidget>
 
 
QTube::QTube()
{
}
QTube::QTube(QNewScene *scene,int speed): QWidget()
{
    isOver = false;
    newscene = scene;
    qlbl = new QLabel();
    qtopclip = new QMovie(videourl);
    qlbl->setAlignment(Qt::AlignTop | Qt::AlignLeft);
    qlbl->setContentsMargins(0,0);
    qlbl->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding);
    qvideoplayer = newscene->addWidget(qlbl);
    qvideoplayer->setPos(x,y);
    qlbl->setMovie(qtopclip);
    qtopclip->setSpeed(speed);
    qtopclip->start();
    qtopclip->stop();
    qlbl->setFixedHeight(qtopclip->currentImage().height());
    qlbl->setFixedWidth(qtopclip->currentImage().width());
    QObject::connect(qtopclip,&QMovie::finished,[ = ]() {this->qMovieEnd();});
}
 
void QTube::qStop()
{
    qtopclip->stop();
}
 
void QTube::qPlay()
{
    qtopclip->start();
}
 
void QTube::qToFrane(int frameNumber)
{
    qtopclip->jumpToFrame(frameNumber);
    qtopclip->stop();
}
 
void QTube::qMovieEnd()
{
    isOver = true;
    emit qTubeFinished();
    //qDebug() << qtopclip->fileName() << qtopclip->frameCount() << "  " << isOver;
}
 
void QTube::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<"RIGHT BUTTON" << qtopclip->fileName();
    event->accept();
}

然后这个类的对象被推送到我的 QGraphicsScene 实现中

#include "qnewscene.h"
#include "qglobalfon.h"
#include <QGraphicsProxyWidget>
 
QNewScene::QNewScene(QObject *parent) : QGraphicsScene(parent)
{
 
    //draw a global background,it's just a picture
    gf01 = new QGlobalFon (this);
 
    qTube01 = new QTube(this,":/new/prefix1/Items/Tube01.gif",137,666,500);
    qTube02 = new QTube(this,":/new/prefix1/Items/Tube02.gif",153,679,100);
    qTube03 = new QTube(this,":/new/prefix1/Items/Tube03.gif",140,500);
}
 
QNewScene::~QNewScene()
{
    
}

单个窗口中的图形场景

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include "qnewscene.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QNewScene(this);
    scene->setFont(QFont("Times",13,100,0));
    scene->setSceneRect(0,1900,1200); // это чтобы сцена была ограничена окном
    ui->graphicsView->setScene(scene);
    ui->graphicsView->setBackgroundBrush(QBrush(QColor(115,204,207,255),Qt::SolidPattern));
 
    //костыль чтобы все перерисовалось сразу как надо
    QSize newSize;
    newSize.setWidth(800);
    newSize.setHeight(600);
    QResizeEvent* resizeEvent = new QResizeEvent(newSize,ui->graphicsView->size());
    QCoreApplication::sendEvent(ui->graphicsView,resizeEvent);
 
}
 
MainWindow::~MainWindow()
{
    QMessageBox msgBox;
    msgBox.setText("Работа программы завершена");
    msgBox.exec();
    delete ui;
}

我试图实现当这些在 QGraphicsScene 上播放 gif 的小部件可以用鼠标单击并获得某种反应时。但是,单击鼠标按钮没有任何作用。不清楚为什么,就像一切都按照教科书一样。

解决方法

  1. 鼠标事件不会传递给您的小部件,而是传递给标签。要查看标签接收的事件,请在您的小部件中实现 filterEvent 方法,并将该小部件安装为标签的事件过滤器。

  2. 当覆盖方法时,总是添加 override specifier - 这样你就可以确保你使用了正确的方法签名。如果您的代码无法编译,这会告诉您您没有覆盖任何内容,而是添加了一个新方法,其签名可能与应有的略有不同。此类错误很容易犯,并且在大型代码库中,如果测试覆盖率不足(并不罕见),它们可能会潜伏多年,这就是 C++ 中添加 override 说明符的原因。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...