QGraphicsLineItem中setLine是绘制直线,那绘制小圆点该怎么实现?鼠标的标识为十字线该怎么设置
时间: 2024-03-11 14:50:33 浏览: 20
要在 QGraphicsScene 中绘制小圆点,可以使用 QGraphicsEllipseItem。可以使用 setRect() 函数设置它的大小和位置,并使用 setBrush() 函数设置它的颜色。
在鼠标的标识为十字线时,可以使用 QGraphicsLineItem 来绘制两条交叉的直线,这两条直线的交点就是鼠标的位置。可以使用 setPen() 函数设置直线的颜色和样式,例如设置为红色和虚线。
以下是示例代码:
```
// 绘制小圆点
QGraphicsEllipseItem *dot = new QGraphicsEllipseItem(x, y, radius, radius);
dot->setBrush(Qt::black);
scene->addItem(dot);
// 绘制鼠标标识
QGraphicsLineItem *hLine = new QGraphicsLineItem(0, y, screenWidth, y);
hLine->setPen(QPen(Qt::red, 1, Qt::DashLine));
scene->addItem(hLine);
QGraphicsLineItem *vLine = new QGraphicsLineItem(x, 0, x, screenHeight);
vLine->setPen(QPen(Qt::red, 1, Qt::DashLine));
scene->addItem(vLine);
```
相关问题
公有继承QObject和QGrapgicsPathItem后实现鼠标绘制直线图元完整代码
这里是一个完整的实现鼠标绘制直线图元的示例代码:
```cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsLineItem>
#include <QMouseEvent>
class LineItem : public QObject, public QGraphicsLineItem
{
Q_OBJECT
public:
LineItem(QGraphicsItem *parent = nullptr)
: QObject(), QGraphicsLineItem(parent)
{
setFlag(QGraphicsItem::ItemIsSelectable);
}
void mousePressEvent(QGraphicsSceneMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_startPos = event->scenePos();
m_endPos = event->scenePos();
setLine(QLineF(m_startPos, m_endPos));
setSelected(true);
} else {
QGraphicsLineItem::mousePressEvent(event);
}
}
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
{
if (isSelected() && event->buttons() & Qt::LeftButton) {
m_endPos = event->scenePos();
setLine(QLineF(m_startPos, m_endPos));
} else {
QGraphicsLineItem::mouseMoveEvent(event);
}
}
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
{
if (isSelected() && event->button() == Qt::LeftButton) {
emit lineFinished(QLineF(m_startPos, m_endPos));
} else {
QGraphicsLineItem::mouseReleaseEvent(event);
}
}
signals:
void lineFinished(QLineF line);
private:
QPointF m_startPos;
QPointF m_endPos;
};
class GraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
GraphicsScene(QObject *parent = nullptr)
: QGraphicsScene(parent)
{
connect(this, &GraphicsScene::lineFinished, this, &GraphicsScene::addLineItem);
}
void mousePressEvent(QGraphicsSceneMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_lineItem = new LineItem();
addItem(m_lineItem);
m_lineItem->setPos(event->scenePos());
} else {
QGraphicsScene::mousePressEvent(event);
}
}
private slots:
void addLineItem(QLineF line)
{
QGraphicsLineItem *lineItem = new QGraphicsLineItem(line);
addItem(lineItem);
}
private:
LineItem *m_lineItem;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView view;
GraphicsScene scene;
view.setScene(&scene);
view.show();
return a.exec();
}
#include "main.moc"
```
这个示例代码使用了 Qt 的图形框架,通过公有继承 QObject 和 QGraphicsPathItem 来实现自定义的直线图元,并在 `mousePressEvent`、`mouseMoveEvent` 和 `mouseReleaseEvent` 中监听鼠标事件,实现了鼠标绘制直线的功能。同时,使用了信号和槽机制,使得当鼠标绘制完成一条直线时,将直线添加到场景中。
qt中使用鼠标绘制直线图元的例子
以下是一个简单的示例,演示如何在Qt中使用鼠标绘制直线图:
```cpp
#include <QtGui>
#include <Widgets>
class Line : public QGraphicsLineItem
{
public:
Line(const QLineF& line) : QGraphicsLineItem(line) {}
QRectF boundingRect() const override { return pen().widthF() + 20.0 + QGraphicsLineItem::boundingRect(); }
QPainterPath shape() const override
{
QPainterPath path = QGraphicsLineItem::shape();
path.addRect(boundingRect());
return path;
}
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override
{
if (option->state & QStyle::State_Selected)
{
painter->setPen(QPen(option->palette.windowText(), 0, Qt::DotLine));
painter->drawRect(boundingRect());
}
QGraphicsLineItem::paint(painter, option, widget);
}
};
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QWidget* parent = nullptr) : QGraphicsView(parent), m_isDrawing(false), m_line(nullptr)
{
setRenderHint(QPainter::Antialiasing);
setDragMode(QGraphicsView::RubberBandDrag);
setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing);
setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
setSelectionMode(QGraphicsView::SingleSelection);
}
protected:
void mousePressEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
m_startPos = mapToScene(event->pos());
m_isDrawing = true;
}
QGraphicsView::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent* event) override
{
if (m_isDrawing)
{
if (!m_line)
{
m_line = new Line(QLineF(m_startPos, mapToScene(event->pos())));
scene()->addItem(m_line);
}
else
{
m_line->setLine(QLineF(m_startPos, mapToScene(event->pos())));
}
}
QGraphicsView::mouseMoveEvent(event);
}
void mouseReleaseEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton && m_isDrawing)
{
m_isDrawing = false;
m_line = nullptr;
}
QGraphicsView::mouseReleaseEvent(event);
}
private:
bool m_isDrawing;
QPointF m_startPos;
Line* m_line;
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QGraphicsScene scene;
GraphicsView view(&scene);
view.setRenderHint(QPainter::Antialiasing);
view.setScene(&scene);
view.setDragMode(QGraphicsView::RubberBandDrag);
QGraphicsLineItem* line = new QGraphicsLineItem(QLineF(0.0, 0.0, 100.0, 100.0));
line->setPen(QPen(Qt::red, 2));
scene.addItem(line);
QGraphicsEllipseItem* ellipse = new QGraphicsEllipseItem(QRectF(0.0, 0.0, 100.0, 100.0));
ellipse->setPen(QPen(Qt::blue, 2));
ellipse->setBrush(QBrush(Qt::green));
scene.addItem(ellipse);
view.setSceneRect(-150, -150, 300, 300);
view.setFixedSize(300, 300);
view.show();
return app.exec();
}
```
该示例演示了如何使用QGraphicsView和QGraphicsScene来绘制直线。在鼠标按下时,记录起始位置,并在鼠标移动时绘制直线。在鼠标释放时,停止绘制。该示例还演示了如何添加其他类型的图元,如椭圆和直线。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)