qt 画多边形(实现鼠标拖动节点)
---恢复内容开始---
2018-01-06
这个小例子实现了移动鼠标,鼠标的坐标信息跟随鼠标移动,多边形的实现,鼠标点击可以拖动多边形点的位置,(其中有个问题?我在QMainWindow下,用mouseMoveEvent事件,只有鼠标点击移动才会有效,不知道是qt的原因,还是我实现的问题,知道的可以给我留言,谢谢)以下是基于widget类实现的不会存在那个问题()

widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void init(); //初始化数据的函数
protected:
void paintEvent(QPaintEvent *event); //绘图事件
void mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件
void mousePressEvent(QMouseEvent *event);//鼠标单击事件
void mouseMoveEvent(QMouseEvent *event);//鼠标移动事件
void mouseDoubleClickEvent(QMouseEvent *event);//鼠标双击事件
private:
Ui::Widget *ui;
int x[5]={17,89,199,277,100},y[5]={150,93,49,127,300}; //定义多边形的5个点
int m,m_mouse_style,j;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QToolTip>
#include <QMouseEvent>
#include <QDebug>
#include <QPainter>
#include <QPaintEvent>
#include <QWhatsThis>
#include <QPen>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setMouseTracking(true);
init(); //初始化数据
}
Widget::~Widget()
{
delete ui;
}
void Widget::init(){
m=0; //为所有的全局数据初始化 增加程序的鲁棒性
m_mouse_style=0;
j=0;
}
void Widget::mouseMoveEvent(QMouseEvent *event){
m=0; //还应该在这在给m 赋一次值 为了清空鼠标上一次在某个点上留下的值
QString zuo=QString("%1 %2").arg(event->pos().x()).arg(event->pos().y());
QToolTip::showText(QPoint(event->globalPos()),zuo,this); //显示鼠标坐标 更随鼠标用方框的形式
//在mainwindows 这个类中用 mouseMoveEevent 事件只有点击拖动鼠标时才会有效 不知道是什么原因
for(int i=0;i<5;i++){
if(fabs(event->pos().x()-x[i])<=5&& fabs(event->pos().y()-y[i])<=5){
//fabs()这个函数是用来去绝对值的
m=m+1;
}}
if(m!=0)
{
setCursor(Qt::CrossCursor); //改变鼠标的样式
update(); //刷新
}else {
setCursor(Qt::ArrowCursor);
update();
}
if(m_mouse_style==1){ //改变点的位置
x[j]=event->pos().x();
y[j]=event->pos().y();
update();
}
}
void Widget::mousePressEvent(QMouseEvent *event){
if(event->button()==Qt::LeftButton){ //判断是否是左键点击
for(int i=0;i<5;i++){
if(fabs(event->pos().x()-x[i])<=5&& fabs(event->pos().y()-y[i])<=5){
//判断鼠标的位置
j=i;
m_mouse_style=1;
setCursor(Qt::CrossCursor);
break;
}
}
}else {
setCursor(Qt::ArrowCursor);
}
}
void Widget::mouseReleaseEvent(QMouseEvent *event){// 鼠标释放事件
m_mouse_style=0;
setCursor(Qt::ArrowCursor);
update();
}
void Widget::mouseDoubleClickEvent(QMouseEvent *event){
}
void Widget::paintEvent(QPaintEvent *event){
QPainter painters(this);
QPen pen; //设置点的样式
pen.setColor(Qt::red); //改变颜色
pen.setWidth(5); //改变点的宽度
painters.setPen(pen);
QPoint point;
for(int i=0;i<5;i++){ //画出5个点
painters.drawPoint(x[i],y[i]);
}
QPen pen1; //设置线的样式
pen1.setWidth(2);
pen1.setColor(Qt::blue);
painters.setPen(pen1);
QPolygon ply; //多边形
ply.setPoints(5,x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3],x[4],y[4]); //点的集合
painters.drawConvexPolygon(ply); //绘制出多边形
}
---恢复内容结束---
qt 画多边形(实现鼠标拖动节点)的更多相关文章
- WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)
;//1:不同级, 不为1:拖同级 private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) { if (e.Button ...
- qt 鼠标拖动窗口放大缩小
// 鼠标拖动 具体实现void mouseMoveEvent(QMouseEvent * pEvent) { if (pEvent->buttons() & Qt::LeftButto ...
- 最全vue的vue-amap使用高德地图插件画多边形范围
一.在vue-cli的框架下的main.js(或者main.ts)中引入高德插件,代码如下: import Vue from 'vue' import VueAMap from 'vue-amap' ...
- CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果
CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果 开始 一图抵千言.首先来看鼠标拖动太阳(光源)的情形. 然后是鼠标拖拽旋转模型的情形. 然后我们移动摄像 ...
- c# 利用 两个TREEVIEW控件完成TEENODE的鼠标拖动操作
功能说明: 我们有两个TREEVIEW控件——TREEVIEW1,TREEVIEW2.Treeview1内有三个NODE,Treeview2内有三个NODE.将Treeview1内的NODE拖动到Tr ...
- 使用Java、Matlab画多边形闭合折线图
由于写论文要将“哈密顿回路问题(TSP)”的求解中间结果表示出来,查了一下使用程序画多边形图形.现在在总结一下,这个图是“由给定节点首尾相连的”闭合多边形. 1.使用matlab作闭合多边形图 没有找 ...
- vue+echarts实现可拖动节点的折现图(支持拖动方向和上下限的设置)
本篇文档主要是利用echarts实现可拖动节点的折现图,在echarts中找到了一个demo,传送门:https://echarts.baidu.com/examples/editor.html?c= ...
- echarts实现多条可拖动节点的折现图
这篇博文主要是利用echarts实现两条以及多条可拖动节点的曲线,demo脱胎于官方demo,在官方demo的基础上添加了另一条曲线.因为之前写过一篇在vue中使用echarts实现可拖动节点的折线图 ...
- jQuery实现鼠标拖动改变Div高度
最近项目中需要在DashBoard页面做一个事件通知栏,该通知栏固定位于页面底部,鼠标拖动该DIV实现自动改变高度扩展内容显示区域. 以下是一个设计原型,基于jQuery实现,只实现了拖动效果,没有做 ...
随机推荐
- PTA L2-001 紧急救援 (带权最短路)
<题目链接> 题目大意: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
- commanderJs编写命令行工具(cli)
前言: 最近需要做一个内部的node cli来独立构建流程,对整个命令行工具实现流程有了大致了解,下面来解释一下如何实现一个cli,和如何使用 commander 库. 新手误区: 在开始实现之前 ...
- react学习一篇就够了
webstrom自动格式化代码 命令 js框架 MVC 安装 npm install create-react-app -g 生成项目(项目名npm发包包命名规范 /^[a-z0-9_-]$/) cr ...
- Android 常用知识点
1.Kotlin 将字节大小转换为KB,MB,GB 并保留两位小数 fun getFileSize(size: Long): String { var GB = 1024 * 1024 * 1024 ...
- DWM1000 测距原理简单分析 之 SS-TWR代码分析2 -- [蓝点无限]
蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 首先将SS 原理介绍中的图片拿过来,将图片印在脑海里. 对于DeviceA 和 DeviceB来说,初 ...
- Java-IO流之输入输出流基础示例
一.理论: 1.什么是输入输出? 输入输出的对象是数据,数据的存储区域是磁盘或者光盘等设备,我们知道还有一个存储数据的空间----内存,其中磁盘的速度比较慢,内存的速度比较快,把数据读入内存的动作称作 ...
- __x__(27)0907第四天__ float 浮动
float 浮动 块元素脱离文档流,水平排列. 浮动元素 会尽量往左上(left),或者右上(right)浮动,直到遇到 块元素 或者 其他浮动元素. 可选值: none; 默认值,不脱离文档流 ...
- 爱奇艺直播 - 春晚直播业务API架构
小结: 1.服务熔断策略 在网关服务中经常会对后端不同api接口做服务聚合,比如A服务 -> B服务 -> C服务 ,如果C服务出现问题,那么在调用C服务之前需要做熔断.而在设计熔断器的时 ...
- 20175303 2018-2019-2 《Java程序设计》第8周学习总结
20175303 2018-2019-2 <Java程序设计>第8周学习总结 教材学习内容总结 本周学习<Java程序设计>第十五章: 泛型: 泛型(Generics)的主要目 ...
- 查看历史会话等待事件对应的session信息
此处以enq: TX - row lock contention等待时间为例. 查看snap_id对应时间 select to_char(s.startup_time,'dd Mon "at ...