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);  //繪制出多邊形
}
 

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM