अद्यतन:: वहाँ एक नया वर्ग QGraphicsSceneMouseEvent
कहा जाता है इस थोड़ा आसान बनाता है यह मेरे वर्तमान कोड है। मैं सिर्फ इसे यहाँ का उपयोग कर एक उदाहरण समाप्त:
https://stackoverflow.com/a/26903599/999943
यह नीचे में है कि यह उपवर्गों 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;
};
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));
}
नोट mapToScene()
के उपयोग सही ढंग से जहां माउस दृश्य पर क्लिक किया जाता है करने के लिए घटना नक्शा pos()
बनाने के लिए।
यदि आप किसी फॉर्म का उपयोग करने जा रहे हैं तो आपको अपने यूई के केंद्रीय विजिट के लेआउट में अपने उप-वर्गीकृत QGraphicsView
का एक उदाहरण जोड़ना होगा।
QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget(new MyQGraphicsView());
या इसे इस तरह दिखेगा यदि आपके ui पहले से ही एक लेआउट है:
ui->centralWidget->layout()->addWidget(new MyGraphicsView());
आप एक QMainWindow
और एक फार्म का उपयोग नहीं करते हैं, तो आप यह एक QWidget
को जोड़ सकते हैं, तो आप सेट इसके लिए एक लेआउट और उसके बाद उसी 0 लेआउट में अपना QGraphicsView
जोड़ें। यदि आप अपने QGraphicsView
के आस-पास मार्जिन नहीं चाहते हैं, तो बस उस पर कॉल करें और इसे एक अलग लेआउट के अंदर न रखें।
#include <QtGui/QApplication>
#include "myqgraphicsview.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyQGraphicsView view;
view.show();
return a.exec();
}
और यही वह है। अब आप QGraphicsView
के साथ खतरनाक हैं और माउस के साथ उनकी बातचीत।
पढ़ सकते हैं और क्यूटी के Graphics View Framework और संबंधित examples के बारे में अध्ययन करने के लिए जब QGraphicsView
और QGraphicsScene
का उपयोग कर प्रभावी होने के लिए सुनिश्चित करें। वे 2 डी ग्राफिक्स के लिए बहुत शक्तिशाली उपकरण हैं और उनमें एक सीखने की वक्र हो सकती है लेकिन वे इसके लायक हैं।
फ़ैट, "नक्शा टॉससेन() के उपयोग को नोट करें ताकि घटना मानचित्र के पॉज़() को सही तरीके से माउस पर क्लिक किया जा सके।" – mathieug