Я хочу нарисовать линию, используя QGraphicsLineItem. То, что я хочу, это то, что при нажатии на GraphicsView после второго щелчка «Линия» нужно нарисовать. Я смущен синтаксисом QGraphicsLineItem, а также как его использовать. Я новичок в Qt. Пожалуйста, помогите мне решить эту проблему.Линия чертежа в текущей позиции с использованием QGraphicsLineItem
ответ
Вы можете получить графический вид/сцены и переопределить 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.
Я использовал этот код, но получаю следующее: 1) ошибка: «ConstructMode» не был объявлен в этой области 2) ошибка: «ScrollMode» не был объявлен в этой области – user3859872
Пожалуйста, помогите мне.Я не понимаю, где и как объявить конструкцию и Scrollmode – user3859872
ScrollMode и ConstructMode были использованы мной, чтобы отличить ли я в режиме Construct/Draw или просто хочу прокрутить сцену. Вы можете удалить их, если они вам не нужны. (Удалите также объявление m_mode). – Pratham
Вы можете использовать этот фрагмент кода.
* ч
#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));
}
}
- 1. OpenGL: линия чертежа с использованием вырожденного треугольника
- 2. Линия чертежа Bresenham Код
- 3. линия чертежа между двумя точками
- 4. Линия чертежа с краю плоскости Unity
- 5. Линия чертежа в UITableViewCell (без использования drawRect)
- 6. линия чертежа на графе рассеяния в python
- 7. Проблемы с анимацией QGraphicsLineItem
- 8. QT: Позиция QGraphicsLineItem в QGraphicsScene
- 9. Qt: линия соединяет 2 отдельных чертежа
- 10. ggplot, линия чертежа между точками по граням
- 11. Получение текущей позиции в UITextField
- 12. D3 линия/путь/маркер позиции
- 13. Подвижная ограничивающая рамка QGraphicsLineItem
- 14. QGraphicsLineItem следует QGraphicsEllipseItem
- 15. NSIndexPath для текущей позиции таблицы
- 16. jQuery анимация из текущей позиции
- 17. Захват текущей позиции прокрутки vb.net
- 18. Прокрутка относительно текущей позиции JQuery
- 19. Получение «пути» текущей позиции XmlReader
- 20. Как начать анимацию css с текущей позиции
- 21. Переместить окно сверху с текущей позиции
- 22. андроид скроллер прокрутки с текущей позиции
- 23. Продвижение с текущей позиции, Tweener, AS3
- 24. ViewPager: получение текущей позиции пункт
- 25. Получение текущей позиции из XmlReader
- 26. OpenGl: поиск вашей текущей позиции
- 27. Параллакс относительно текущей позиции фона
- 28. Чтобы отобразить заголовок текущей текущей позиции на карте в iphone
- 29. JQuery - «Селектор» для текущей позиции в документе
- 30. vb.net получить индекс текущей позиции в массиве
Просьба указать код, который у вас есть. Удостоверьтесь, что это коротко - поместите все это в один файл main.cpp. –