我有一个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
答案 0 :(得分:0)
您有一个名为test的对象,而不是一个类。了解如何在代码中定义对象:
test = new QGraphicsView(centralWidget);
这里的代码分别是错误的:
void test::mousePressEvent(QMouseEvent *event)
您需要使用以下行而不是上述行:
void MyGraphicsView::mousePressEvent(QMouseEvent *event)
请注意,这只会解决手头的编译问题。基于这个问题,你可能会遇到运行时行为的其他麻烦......
如果您还在询问实时操作,我可能会查看下面的Qt示例来处理鼠标按下事件:
您可以从他们的代码中看到确切的实现细节:
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
来创建一个简单的类似绘画的应用程序。在场景中进行操作需要少一点打字,看起来看起来更干净。