16 c++ qt mouseclick-event qgraphicsscene
我有以下代码来设置QGraphicsScene.我希望点击场景并在我点击的位置画一个点.我怎么能这样做?这是我目前的代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGraphicsScene *scene;
QGraphicsView *view = new QGraphicsView(this);
view->setGeometry(QRect(20, 50, 400, 400));
scene = new QGraphicsScene(50, 50, 350, 350);
view->setScene(scene);
}
Run Code Online (Sandbox Code Playgroud)
phy*_*att 33
更新:有一个叫做的新类QGraphicsSceneMouseEvent使这更容易一些.我刚刚在这里完成了一个使用它的例子:
它与下面的答案不同之处在于它不是子类QGraphicsScene,QGraphicsView而是使用它,mouseEvent->scenePos()因此不需要手动映射坐标.
你走在正确的轨道上,但你仍然需要更多的东西.
您需要子类QGraphicsView才能使用鼠标按下或使用鼠标释放执行某些操作QMouseEvent.
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
#include <QMouseEvent>
class MyQGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyQGraphicsView(QWidget *parent = 0);
signals:
public slots:
void mousePressEvent(QMouseEvent * e);
// void mouseReleaseEvent(QMouseEvent * e);
// void mouseDoubleClickEvent(QMouseEvent * e);
// void mouseMoveEvent(QMouseEvent * e);
private:
QGraphicsScene * scene;
};
Run Code Online (Sandbox Code Playgroud)
QGraphicsView原则上没有无维度点.您可能希望使用QGraphicsEllipse项目或简单地scene->addEllipseItem()使用非常小的半径.
#include "myqgraphicsview.h"
#include <QPointF>
MyQGraphicsView::MyQGraphicsView(QWidget *parent) :
QGraphicsView(parent)
{
scene = new QGraphicsScene();
this->setSceneRect(50, 50, 350, 350);
this->setScene(scene);
}
void MyQGraphicsView::mousePressEvent(QMouseEvent * e)
{
double rad = 1;
QPointF pt = mapToScene(e->pos());
scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0,
QPen(), QBrush(Qt::SolidPattern));
}
Run Code Online (Sandbox Code Playgroud)
需要注意的使用mapToScene(),使pos()事件映射的正确的鼠标点击的场景里.
QGraphicsView如果要使用表单,则需要将子类的实例添加到ui的centralWidget布局中.
QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget( new MyQGraphicsView() );
Run Code Online (Sandbox Code Playgroud)
或者如果您的ui已经有布局,它将如下所示:
ui->centralWidget->layout()->addWidget( new MyGraphicsView() );
Run Code Online (Sandbox Code Playgroud)
如果您不使用a QMainWindow和表单,则可以在为其QWidget设置布局时将其添加到a ,然后QGraphicsView以类似方式将其添加到该布局.如果您不想在您周围QGraphicsView留一个边距,只需在其上调用show并且不要将其放在不同的布局中.
#include <QtGui/QApplication>
#include "myqgraphicsview.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyQGraphicsView view;
view.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
就是这样.现在你QGraphicsView和他们与鼠标的互动很危险.
请务必阅读和研究Qt的Graphics View Framework以及使用和时有效的相关示例.它们是用于2D图形的非常强大的工具,可以有一点学习曲线,但它们是值得的.QGraphicsViewQGraphicsScene
| 归档时间: |
|
| 查看次数: |
25786 次 |
| 最近记录: |