2011-10-20 14 views
13

मेरे पास 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); 
} 

उत्तर

31

अद्यतन:: वहाँ एक नया वर्ग 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 डी ग्राफिक्स के लिए बहुत शक्तिशाली उपकरण हैं और उनमें एक सीखने की वक्र हो सकती है लेकिन वे इसके लायक हैं।

+0

फ़ैट, "नक्शा टॉससेन() के उपयोग को नोट करें ताकि घटना मानचित्र के पॉज़() को सही तरीके से माउस पर क्लिक किया जा सके।" – mathieug

संबंधित मुद्दे