永发信息网

QT 利用QPainter画了一条线,这条线能随鼠标的拖曳而拖动吗?这个功能能实现吗,如果能,请问怎么实现。

答案:1  悬赏:80  手机版
解决时间 2021-01-20 21:26
QT 利用QPainter画了一条线,这条线能随鼠标的拖曳而拖动吗?这个功能能实现吗,如果能,请问怎么实现。
最佳答案
可以用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保存线的位置吧。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
寻苏童《妻妾成群》评论
兄弟们谁知道在庄河有个叫“零点”娱乐场所,
晚霞灿烂落红美,人到花甲正金秋 什么意思
燃气灶着火一坐上锅就熄火是什么
剑灵专属版电脑管家。 有这个版本吗?
镇魂街守护灵等级分别是什么?
421除以19估算多少
陕西省乾县属于哪个市
抚远的人口
鲁鑫二手车交易市场地址在哪,我要去那里办事
奔驰第一辆自动挡汽车
catia 中如何显示多个视口
张亮他如何呢?他能做提拉的吗?
研究生新生开学遇教师节,要给导师买礼物吗?
这个发型叫什么?是学生头还是蘑菇头?
推荐资讯
浸人心脾哪个字错了
上海双新塑料制品有限公司怎么样?
水烟丝哪里有卖多少钱一两
蓝波和瑞包恩bl
(2009· 江苏扬州模拟考试)国家对下乡家电
(5-x)的平方-16=0
苏东坡改联立志 修改前后的对联有什么不一样
直接赋给self.view 和 addsubview 的区别
为什么y66前摄像头照出来的照片都是模糊的
Our history teacher often tells us funny s
四分之3×几=0点四
英歌手表怎么看真假
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?