Qt mousePressEvent

时间:2013-12-30 21:35:06

标签: qt children

我有一个QMainWindow,它有许多小部件,它们有框架,标签等......但最重要的是一个名为test的QGraphicsView。我希望它在点击时做出响应,因为我打算创建类似“Paint”的程序。我可以让mousePressEvent为MainWindow工作:

void MainWindow::mousePressEvent(QMouseEvent *event)
{         
        //stuff    
}

问题是,当我点击程序中的任何地方时,我无法与QGraphicsView一起工作,而不是MainWindow,例如:

void test::mousePressEvent(QMouseEvent *event)
{         
        //stuff    
}

我得到“test不是类或命名空间名称”错误。我到处寻找解决方案,我的构造函数在开始时有ui> setupUi(this),我也有包括ui

#include "ui_mainwindow.h"
// some imore includes

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        // stuff
    }

我不知道我在这里错过了什么。我希望我不会注意每次点击时鼠标点击事件pos()的位置以及它是否在QGraphicsView边界,因为我还打算让用户点击其他一些QWidgets。

提前致谢

编辑:测试声明(由Qt自动创建,在ui_mainwindow.h中):

    test = new QGraphicsView(centralWidget);
    test->setObjectName(QStringLiteral("test"));
    test->setDragMode(QGraphicsView::NoDrag);

另外,centralWidget是MainWindow的子项,因此它的:MainWindow-> centralWidget-> test

EDIT2:我在标题中也有Q_OBJECT,我尝试使用Q_SLOTS

2 个答案:

答案 0 :(得分:0)

您有一个名为test的对象,而不是一个类。了解如何在代码中定义对象:

test = new QGraphicsView(centralWidget);

这里的代码分别是错误的:

void test::mousePressEvent(QMouseEvent *event)

您需要使用以下行而不是上述行:

void MyGraphicsView::mousePressEvent(QMouseEvent *event)

请注意,这只会解决手头的编译问题。基于这个问题,你可能会遇到运行时行为的其他麻烦......

如果您还在询问实时操作,我可能会查看下面的Qt示例来处理鼠标按下事件:

Diagram Scene Example

您可以从他们的代码中看到确切的实现细节:

class DiagramScene : public QGraphicsScene
{
    Q_OBJECT
    ...

    protected:
        void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);
    ...
}

> The mousePressEvent() function handles mouse press event's different depending on which mode the DiagramScene is in. We examine its implementation for each mode:

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    ...
}

答案 1 :(得分:0)

IIRC Qt事件传递将事件传递到指针位置的特定子窗口小部件,因此您不会通过重新实现父窗口小部件中的鼠标事件方法(如QMainWindow)来捕获任何有用的内容。最简单的方法是捕获QGraphicsScene中的事件。我有another answer演示如何通过在mousePressEvent派生的类中重新实现QGraphicsScene来创建一个简单的类似绘画的应用程序。在场景中进行操作需要少一点打字,看起来看起来更干净。