网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月27日
漏签
0
天
qt吧
关注:
49,895
贴子:
160,002
看贴
图片
吧主推荐
游戏
7
回复贴,共
1
页
<<返回qt吧
>0< 加载中...
QT鼠标移动问题
只看楼主
收藏
回复
zt201155
初级粉丝
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
现在我用opengl画了一个矩形,用2个点控制的矩形。p1,p2点。现在我想让鼠标进入这个矩形内部,点击到鼠标拖动,就能让这个矩形移动拖动了的距离。这怎么实现。
我开始想的是,鼠标在内部按下鼠标键就记录一个点,当移动后,鼠标键松开记录最后一个点,然后这2个点做差,差值跟p1,p2点相加,获得新德p1,p2点。。但是我也不会。
此方的呆毛
核心吧友
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
看一下Qt事件机制,重写下面两个函数可以解决。
virtual void
mousePressEvent ( QMouseEvent * event ) //判断并记录初始点的位置
virtual void
mouseReleaseEvent ( QMouseEvent * event ) //记录最终位置,计算,重绘。
2025-12-27 18:55:32
广告
不感兴趣
开通SVIP免广告
qxchengxuyuan
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
头文件
#ifndef RECT_H
#define RECT_H #include <QtGui/QDialog>
#include <QRectF> class Rect : public QDialog
{
Q_OBJECT public:
Rect(QWidget *parent = 0, Qt::WFlags flags = 0);
~Rect(); protected:
void paintEvent(QPaintEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
QPoint p1;
QPoint p2;
QPoint startPos;
QRect rect;
bool inRectBl;
}; #endif // RECT_H
qxchengxuyuan
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
实现文件:
#include "rect.h"
#include <QtGui> Rect::Rect(QWidget *parent, Qt::WFlags flags)
: QDialog(parent, flags)
{
p1 = QPoint(10,10);
p2 = QPoint(50,50);
rect = QRect(p1,p2);
inRectBl = false;
setMouseTracking(true);
}
void Rect::paintEvent(QPaintEvent * event)
{
QPainter painter(this);
painter.drawRect(rect);
QDialog::paintEvent(event);
}
void Rect::mouseMoveEvent(QMouseEvent *event)
{
QPoint pos = event->pos();
if (pos.x()>p1.x() && pos.y()>p1.y() && pos.x()<p2.x() && pos.y()<p2.y())
inRectBl = true;
else
inRectBl = false;
QDialog::mouseMoveEvent(event);
}
void Rect::mousePressEvent(QMouseEvent *event)
{
if (inRectBl)
startPos = event->pos();
else
startPos = QPoint();
QDialog::mousePressEvent(event);
}
void Rect::mouseReleaseEvent(QMouseEvent *event)
{
if (!startPos.isNull())
{
QPoint sub = event->pos() - startPos;
p1+=sub;
p2+=sub;
rect = QRect(p1,p2);
update();
}
QDialog::mouseReleaseEvent(event);
}
Rect::~Rect()
{ }
qxchengxuyuan
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我是不是很无聊,主要是也在学习QT,希望和大家交流
zt201155
初级粉丝
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
谢谢 你给我的帮助哈 》》
你能不能只用个
void Rect::mouseMoveEvent(QMouseEvent *event)实现呢 不用
void Rect::mouseReleaseEvent(QMouseEvent *event)
void Rect::mousePressEvent(QMouseEvent *event) 事件
我写的那个 ,只用了移动事件,就是开始拖动的时候有点瑕疵,开始拖动时,线框会变点位置,其余度正常 。。。
qxchengxuyuan
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
rect.h
#ifndef RECT_H
#define RECT_H #include <QtGui/QDialog>
#include <QRectF>
class QLineEdit; class Rect : public QDialog
{
Q_OBJECT public:
Rect(QWidget *parent = 0, Qt::WFlags flags = 0);
~Rect(); protected:
void paintEvent(QPaintEvent *event);
void mouseMoveEvent(QMouseEvent *event); private:
QPoint p1;
QPoint p2; QRect rect;
bool inRectBl;
}; #endif // RECT_H
qxchengxuyuan
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
rect.cpp
#include "rect.h"
#include <QtGui> Rect::Rect(QWidget *parent, Qt::WFlags flags)
: QDialog(parent, flags)
{
p1 = QPoint(10,10);
p2 = QPoint(50,50);
rect = QRect(p1,p2);
inRectBl = false;
setMouseTracking(true);
}
void Rect::paintEvent(QPaintEvent * event)
{
QPainter painter(this);
painter.drawRect(rect);
QDialog::paintEvent(event);
}
void Rect::mouseMoveEvent(QMouseEvent *event)
{
static QPoint originPos;
QPoint pos = event->pos();
if (!inRectBl && pos.x()>p1.x() && pos.y()>p1.y() && pos.x()<p2.x() && pos.y()<p2.y())
{
originPos = pos;
inRectBl = true;
}
if (inRectBl)
{
QPoint sub = pos - originPos;
QPoint p1 = this->p1 + sub;
QPoint p2 = this->p2 + sub;
rect = QRect(p1,p2);
}
update();
QDialog::mouseMoveEvent(event);
} Rect::~Rect()
{ }
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示