QT 利用QPainter画了一条线,这条线能随鼠标的拖曳而拖动吗?这个功能能实现吗,如果能,请问怎么实现。
答案:1 悬赏:80 手机版
解决时间 2021-01-20 21:26
- 提问者网友:活着好累
- 2021-01-20 13:22
QT 利用QPainter画了一条线,这条线能随鼠标的拖曳而拖动吗?这个功能能实现吗,如果能,请问怎么实现。
最佳答案
- 五星知识达人网友:西风乍起
- 2021-01-20 13:59
可以用mouseMoveEvent或timer刷新鼠标坐标,然后重画。以下是timer方法:
Draw::Draw(QWidget *parent):QWidget(parent)
{
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(updateSlot()));
m_timer->start(10);
}
void Draw::updateSlot()
{
QPoint pos = mapFromGlobal(QCursor::pos());
m_startX = pos.x();
m_startY = pos.y();
update();
}
void Draw::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawLine(m_startX, m_startY, m_startX+20, m_startY+10);
}追问首先感谢你的回答。可能是我描述上的问题,按照你的代码实现后,随意拖动鼠标,线都会跟着鼠标拖动。而我所需要实现的功能是当我画完线以后,用鼠标选中这根线后,鼠标左键按下时才对线进行拖动的。追答如果按下才拖动,不必用timer/tracking.
先设置一个私有变量m_dragging = 0
保护继承mousePressEvent方法,方法内取得event->pos()后, 可以判断是否选中. 如果选中, m_dragging = 1.
保护继承mouseMoveEvent方法, 方法内如果m_dragging = 1, 则刷新m_startX,m_startY, update().追问怎么样判断event->pos()获得的位置点是在我们画的线上的点呢。追答很简单,画完时保存坐标,然后同event->pos比较。追问画完只能知道起始点和终点坐标。因为我们做的功能,现在线是可以任意旋转和上下左右移动的,旋转后线的坐标等也都发生了变化。要判断这条线是否选中(光标点是否在这条所画的线段上),还是有点复杂的(而且现在不仅一条线,还有多条线交叉的情况)。目前我的做法是把线画在一个QLabel控件上,现在可以上下左右移动控件,但不知道怎么可以旋转QLabel这个控件?追答用QLineF, 它的intersect方法可判断是否相交。 setAngle方法可旋转。
旋转QLabel需要修改painterEvent, 且不见得能简化这个过程。用QLineF保存线的位置吧。
Draw::Draw(QWidget *parent):QWidget(parent)
{
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(updateSlot()));
m_timer->start(10);
}
void Draw::updateSlot()
{
QPoint pos = mapFromGlobal(QCursor::pos());
m_startX = pos.x();
m_startY = pos.y();
update();
}
void Draw::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawLine(m_startX, m_startY, m_startX+20, m_startY+10);
}追问首先感谢你的回答。可能是我描述上的问题,按照你的代码实现后,随意拖动鼠标,线都会跟着鼠标拖动。而我所需要实现的功能是当我画完线以后,用鼠标选中这根线后,鼠标左键按下时才对线进行拖动的。追答如果按下才拖动,不必用timer/tracking.
先设置一个私有变量m_dragging = 0
保护继承mousePressEvent方法,方法内取得event->pos()后, 可以判断是否选中. 如果选中, m_dragging = 1.
保护继承mouseMoveEvent方法, 方法内如果m_dragging = 1, 则刷新m_startX,m_startY, update().追问怎么样判断event->pos()获得的位置点是在我们画的线上的点呢。追答很简单,画完时保存坐标,然后同event->pos比较。追问画完只能知道起始点和终点坐标。因为我们做的功能,现在线是可以任意旋转和上下左右移动的,旋转后线的坐标等也都发生了变化。要判断这条线是否选中(光标点是否在这条所画的线段上),还是有点复杂的(而且现在不仅一条线,还有多条线交叉的情况)。目前我的做法是把线画在一个QLabel控件上,现在可以上下左右移动控件,但不知道怎么可以旋转QLabel这个控件?追答用QLineF, 它的intersect方法可判断是否相交。 setAngle方法可旋转。
旋转QLabel需要修改painterEvent, 且不见得能简化这个过程。用QLineF保存线的位置吧。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯