2014-09-02 4 views
0

Я хочу нарисовать линию, используя QGraphicsLineItem. То, что я хочу, это то, что при нажатии на GraphicsView после второго щелчка «Линия» нужно нарисовать. Я смущен синтаксисом QGraphicsLineItem, а также как его использовать. Я новичок в Qt. Пожалуйста, помогите мне решить эту проблему.Линия чертежа в текущей позиции с использованием QGraphicsLineItem

+1

Просьба указать код, который у вас есть. Удостоверьтесь, что это коротко - поместите все это в один файл main.cpp. –

ответ

0

Вы можете получить графический вид/сцены и переопределить mousePressEvent

Ниже приведен пример использования производных QGraphicsScene и переопределены mousePressEvent

Определение класса:

class MyScene : public QGraphicsScene 

данных Пользователей:

QList<QPointF> m_clickPositions; 
int m_mode; 

Код:

void MyScene::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    if(false == sceneRect().contains(event->scenePos())) 
    { 
     QGraphicsScene::mousePressEvent(event); 
    } 
    else if(Qt::LeftButton == event->button() && m_mode == ConstructMode) 
    { 
     m_clickPositions.append(event->scenePos()); 

     if(m_clickPositions.size() == 2) 
     { 
      QLineF lineF(m_clickPositions[0], m_clickPositions[1]); 
      QGraphicsLineItem* item = this->addLine(lineF); 
      m_clickPositions.clear(); 
      m_mode = ScrollMode; 
     } 

    } 
} 

Я использовал что-то подобное в своем проекте и извлек код. Надеюсь это поможет.
Прокомментируйте это, это не работает.

Редактировать:
В описанной выше программе используются режим ConstructMode и Scroll, чтобы я мог различать, хочу ли я рисовать/конструировать или просто прокручивать сцену. Вы можете удалить их и объявление m_mode, если это не требуется вами.

Если вы хотите использовать режимы, вы можете определить некоторые общедоступные константы и добавить метод setMode(). См. Код ниже.

MyScene.h или какой-Constant файл, если у вас есть один

#define ConstructMode 100 
#define ScrollMode 101 

И добавьте следующую функцию

void MyScene::setMode(int mode) 
{ 
    m_mode = mode; 
} 

После этого, если вы хотите, чтобы войти в режим строительства, вам необходимо позвонить myScene -> setMode (ConstructMode) каждый раз, так как после создания элемента режим сбрасывается на ScrollMode.

+0

Я использовал этот код, но получаю следующее: 1) ошибка: «ConstructMode» не был объявлен в этой области 2) ошибка: «ScrollMode» не был объявлен в этой области – user3859872

+0

Пожалуйста, помогите мне.Я не понимаю, где и как объявить конструкцию и Scrollmode – user3859872

+0

ScrollMode и ConstructMode были использованы мной, чтобы отличить ли я в режиме Construct/Draw или просто хочу прокрутить сцену. Вы можете удалить их, если они вам не нужны. (Удалите также объявление m_mode). – Pratham

1

Вы можете использовать этот фрагмент кода.

* ч

#ifndef GRAPHICSSCENE_H 
#define GRAPHICSSCENE_H 

#include <QGraphicsScene> 
#include <QStack> 
#include <QPoint> 
#include <QMouseEvent> 
class GraphicsScene : public QGraphicsScene 
{ 
    Q_OBJECT 
public: 
    explicit GraphicsScene(QObject *parent = 0); 

signals: 

protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); 
public slots: 
    private: 

    QStack<QPoint> stack; 

}; 

#endif // GRAPHICSSCENE_H 

* .cpp

#include "graphicsscene.h" 
#include <QDebug> 
#include <QGraphicsSceneMouseEvent> 

GraphicsScene::GraphicsScene(QObject *parent) : 
    QGraphicsScene(parent) 
{ 
} 

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    qDebug() << "in"; 
    if (mouseEvent->button() == Qt::LeftButton) 
    { 
     QPoint pos = mouseEvent->scenePos().toPoint(); 


     if(stack.isEmpty()) 
      stack.append(pos); 
     else if(stack.count() == 1) 
     { 
      stack.append(pos); 
      addLine(QLine(stack.pop(),stack.pop()),QPen(Qt::green)); 
     } 
    } 
} 

Использование:

GraphicsScene *scene = new GraphicsScene(this); 
ui->graphicsView->setScene(scene); 
ui->graphicsView->show(); 

Edit: более красивое решение, которое работает, как вам нужно.

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    qDebug() << "in"; 
    if (mouseEvent->button() == Qt::LeftButton) 
    { 
     QPoint pos = mouseEvent->scenePos().toPoint(); 

     if(stack.isEmpty()) 
      stack.append(pos); 
     else 
      addLine(QLine(pos,stack.pop()),QPen(Qt::green)); 
    } 
} 
Смежные вопросы