精华内容
下载资源
问答
  • 之前在网上查询了大量资料来实现在Qt的label中一组直线,逐条选中并移动。本程序做了简单的实现,但是程序中的直线选中部分灵敏度不是很高,如果有需要的可以下载进行改进,如果有跟好的方法判断选中,可以反馈给...
  • Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。使用QGraphics完成。 博客地址:https://blog.csdn.net/luoyayun361/article/details/93890331
  • 要在界面上按下鼠标拖动之后松开鼠标,然后就在界面上绘制出了线、矩形和圆形 代码用了抽象的概念,将三种图形抽象成了一个myShape,在代码中的体现就是定义了一个基类myShape类,其他所有的图像类都继承自这个...
  • QT_拖动鼠标画线_

    热门讨论 2012-03-30 16:43:32
    qt 可多条线并且全部显示 在拖动鼠标时可显示正在的线
  • Qt 绘制可以用鼠标拖动的线段(一)

    千次阅读 多人点赞 2018-09-16 11:58:15
    VS2013 + QT5.7.0 二、效果 1.可以创建任意多条线段; 2.鼠标在靠近到线段时产生吸附效果; 3.可以拖动任意一条线段的任意部位(线段的两个端点或者整条线段)。 效果图: 三、说明 1.创建线段的定义: 线段...
    • 一、环境
      VS2013 + QT5.7.0
    • 二、效果
      1.可以创建任意多条线段;
      2.鼠标在靠近到线段时产生吸附效果;
      3.可以拖动任意一条线段的任意部位(线段的两个端点或者整条线段)。
      效果图:
      这里写图片描述
    • 三、说明
      1.创建线段的定义:

    线段具有起始点和终止点。

    //点
    struct PointEx {
        double x;
        double y;
        PointEx(double a = 0, double b = 0) {
            x = a;
            y = b;
        }
    };
    
    //线段
    struct LineSegment {
        PointEx startPoint;
        PointEx endPoint;
        LineSegment(PointEx a, PointEx b) {
            startPoint = a;
            endPoint = b;
        }
        LineSegment() {
        }
    };

    2.定义线段显示的定义:

        struct LINESEG {
            bool bDraw;//是否绘制
    
            bool bSelLine;//是否选中线
            bool bSelStartPt;//是否选中线段起点
            bool bSelEndPt;//是否选线段终点
            LineSegment* seg;
            LINESEG() {
                bDraw = false;
                bSelLine = false;
                bSelStartPt = false;
                bSelEndPt = false;
                seg = new LineSegment;
            }
        };

    3.把创建的线段使用,vector保存起来

    std::vector<LINESEG*> lineSegs;//线段列表

    4.剩余的就是在鼠标点击、移动、松开时的逻辑控制了

    //按下鼠标
    void MyGraphCal::mousePressEvent(QMouseEvent *event) {
        switch(event->button()) {
        case Qt::LeftButton:
        bLBtnDown = true;
        selectLineSeg = nullptr;
        selectLineSeg = getSeleled();
        if(selectLineSeg != nullptr){//选中线段
            selectLineSeg->bDraw = false;
    
            if(selectLineSeg->bSelStartPt) {//选中起点
                startPoint.setX(selectLineSeg->seg->endPoint.x);
                startPoint.setY(selectLineSeg->seg->endPoint.y);
    
                endPoint.setX(selectLineSeg->seg->startPoint.x);
                endPoint.setY(selectLineSeg->seg->startPoint.y);
            } else if(selectLineSeg->bSelEndPt) {//选中终点
                startPoint.setX(selectLineSeg->seg->startPoint.x);
                startPoint.setY(selectLineSeg->seg->startPoint.y);
    
                endPoint.setX(selectLineSeg->seg->endPoint.x);
                endPoint.setY(selectLineSeg->seg->endPoint.y);
            } else if(selectLineSeg->bSelLine){//选中线段
                movePoint = event->pos();
    
                startPoint.setX(selectLineSeg->seg->startPoint.x);
                startPoint.setY(selectLineSeg->seg->startPoint.y);
    
                endPoint.setX(selectLineSeg->seg->endPoint.x);
                endPoint.setY(selectLineSeg->seg->endPoint.y);
            }
            update();
        } else {//未选中
            startPoint = event->pos();
            endPoint = startPoint;
    
            tempLine = new LINESEG;
            tempLine->seg->startPoint.x = startPoint.x();
            tempLine->seg->startPoint.y = startPoint.y();
        }
        break;
        default:
        break;
        }
    }
    
    //移动鼠标
    void MyGraphCal::mouseMoveEvent(QMouseEvent *event) {
        QPointF movePt = event->pos();
        if (selectLineSeg != nullptr){//选中线段
            if(bLBtnDown) {//鼠标按下
                if(selectLineSeg->bSelStartPt || selectLineSeg->bSelEndPt) {//选中起点或者终点
                    endPoint = movePt;
                } else if(selectLineSeg->bSelLine) {//选中线段
                    double disX = movePt.x() - movePoint.x();
                    double disY = movePt.y() - movePoint.y();
    
                    startPoint.setX(startPoint.x() + disX);
                    startPoint.setY(startPoint.y() + disY);
    
                    endPoint.setX(endPoint.x() + disX);
                    endPoint.setY(endPoint.y() + disY);
    
                    movePoint = movePt;
                }
            }
        } else {//未选中线段
            if(bLBtnDown) {
                endPoint = movePt;
            } else {
                selSeg(movePt);
            }
        }
        update();
    
    }
    
    //松开鼠标
    void MyGraphCal::mouseReleaseEvent(QMouseEvent *event) {
        switch(event->button()) {
        case Qt::LeftButton:
        bLBtnDown = false;
        if(selectLineSeg != nullptr){
    
            if(selectLineSeg->bSelStartPt) {//选中起点
                selectLineSeg->seg->startPoint.x = event->pos().x();
                selectLineSeg->seg->startPoint.y = event->pos().y();
    
            } else if(selectLineSeg->bSelEndPt) {//选中终点
                selectLineSeg->seg->endPoint.x = event->pos().x();
                selectLineSeg->seg->endPoint.y = event->pos().y();
            } else if(selectLineSeg->bSelLine) {//选中线段
                selectLineSeg->seg->startPoint.x = startPoint.x();
                selectLineSeg->seg->startPoint.y = startPoint.y();
    
                selectLineSeg->seg->endPoint.x = endPoint.x();
                selectLineSeg->seg->endPoint.y = endPoint.y();
            }
            selectLineSeg->bDraw = true;
    
            selectLineSeg->bSelStartPt = false;
            selectLineSeg->bSelEndPt = false;
            selectLineSeg->bSelLine = false;
            selectLineSeg = nullptr;
        } else {
            tempLine->seg->endPoint.x = event->pos().x();
            tempLine->seg->endPoint.y = event->pos().y();
            tempLine->bDraw = true;
            lineSegs.push_back(tempLine);
        }
    
        break;
        default:
        break;
        }
    }

    5.注意要添加上线段鼠标移动的激活操作,否则鼠标只有在按下的时候才会激活mouseMoveEvent

    ui.centralWidget->setMouseTracking(true);
    setMouseTracking(true);

    6.如何判断当前鼠标靠近某一条线段呢?

    1. 先确定出当前点到这条线段的所在直线的垂足;
    PointEx perpendicular(PointEx p, LineSegment l) {
        double r = relation(p, l);
        PointEx tp;
        tp.x = l.startPoint.x + r*(l.endPoint.x - l.startPoint.x);
        tp.y = l.startPoint.y + r*(l.endPoint.y - l.startPoint.y);
        return tp;
    }
    1. 判断垂足是不是在这条线段上;
    2. 如果不在这条线段上,则判断垂足距离哪个端点比较近,选中选中的端点;
    3. 如果在这条线段上,则选中这条线段
    void MyGraphCal::selSeg(QPointF&pt) {
        int num = lineSegs.size();
    
    
        for(int i = 0; i < num; i++) {
            LINESEG* oneLine = lineSegs.at(i);
            LineSegment* oneLineDeg = oneLine->seg;
    
            PointEx ptEx(pt.x(), pt.y());
            PointEx np;//线段上的点
            double dis = pToLinesegDist(ptEx, *oneLineDeg, np);
            if(dis < 5 && dis >= 0.0) {
                double l = relation(np, *oneLineDeg);
                if(abs(l)< EP) {//起点
                    oneLine->bSelStartPt = true;
                    oneLine->bSelLine = false;
                    oneLine->bSelEndPt = false;
                } else if(abs(l - 1.0) < EP) {//终点
                    oneLine->bSelEndPt = true;
                    oneLine->bSelLine = false;
                    oneLine->bSelStartPt = false;
                } else if(l < 1 && l > 0) {//整条线
                    oneLine->bSelLine = true;
                    oneLine->bSelEndPt = false;
                    oneLine->bSelStartPt = false;
                }
            } else {
                oneLine->bSelLine = false;
                oneLine->bSelEndPt = false;
                oneLine->bSelStartPt = false;
            }
        }
    }
    • 四、向量
      以上计算过程中用到了向量和向量的点积
      向量的几何意义:一条有方向的线段
      这就是上面定义的线段的来源,定义一点线段要定一它的起始点和终止点,从起始点到终止点的方向就是向量的方向。
      点积的结合意义:向量a、b,r = a*b=|a|*|b|cosα。也就是:向量a的模乘以向量b在向量a上的投影的长度。
      因为α是一个角度,所以可以通过结果r的正负获取两条线段之间的简单关系:
      r>0:两个向量之间的夹角在0-90度之间
      r=0:两个向量互相垂直
      r<0:两个向量之间的夹角在90-180度之间。

    代码下载

    以上!

    展开全文
  • Qt 鼠标拖动缩放

    热门讨论 2013-10-08 21:20:35
    Qt drag和drop基础上,实现QGraphicsItem的鼠标拖动缩放
  • QT实现DDA、中点线法以及画圆和椭圆,点击画图按钮,然后在网格上拖动鼠标,实现线程序,画圆和椭圆和画直线方法类似。上传的是成功运行后的QT工程文件的压缩包。
  • Qt线段绘制并且可以拖动线段绘制Qt线段绘制并且可以拖动线段绘制Qt线段绘制并且可以拖动线段绘制Qt线段绘制并且可以拖动线段绘制
  • Qt鼠标拖动绘制基本几何图形

    千次阅读 热门讨论 2019-06-27 18:58:08
    Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独的对象,鼠标拖动...

    概述

    用Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。

    效果图

    在这里插入图片描述

    实现

    本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独的对象,鼠标拖动绘制的过程是在临时层中完成,release后生成一个矢量的图形item并添加到场景中。

    关键代码

    主场景中有一个父rootItem,在scene中将鼠标或触控事件传到rooitem后动态绘制临时的图形,release事件后生成一个标准的图形对象:

    void GsRootItem::drawPress(int id, const QPointF &p)
    {
        ShapeInfo info;
        info.firstPos = p;
        info.type = getCurType();
        m_Objs.insert(id,info);
    }
    
    void GsRootItem::drawMove(int id, const QPointF &lastPoint, const QPointF &curPoint)
    {
        if(!m_Objs.contains(id)){
            return;
        }
        ShapeInfo info = m_Objs.value(id);
        m_pTempLayer->drawShape(info.type,info.firstPos,curPoint);
    }
    
    void GsRootItem::drawRelease(int id, const QPointF &point)
    {
        if(!m_Objs.contains(id)){
            return;
        }
        ShapeInfo info = m_Objs.value(id);
        drawRealShape(info.type,info.firstPos,point);
        m_Objs.remove(id);
        m_pTempLayer->clear();
    }
    
    ...
    void GsRootItem::drawRealShape(GsShapeType type, QPointF p1, QPointF p2)
    {
        //计算图形绘制区域
        QRectF rect;
        rect.setX(qMin(p1.x(),p2.x()));
        rect.setY(qMin(p1.y(),p2.y()));
        if(type == Shape_Circle){
            rect.setWidth(qAbs(p1.y() - p2.y()));
            rect.setHeight(qAbs(p1.y() - p2.y()));
        }
        else{
            rect.setWidth(qAbs(p1.x() - p2.x()));
            rect.setHeight(qAbs(p1.y() - p2.y()));
        }
        rect.adjust(-5,-5,5,5);
        GsShapeBaseItem * item = m_pShapeFactory->getShapeItem(type,rect,this);
        item->drawShape(p1,p2);
    }
    

    drawRealShape函数就是用与创建一个独立的几何图形,通过以下的工厂模式来生成

     GsShapeBaseItem * item = m_pShapeFactory->getShapeItem(type,rect,this);
    

    工厂代码:

    GsShapeBaseItem *GsShapeFactory::getShapeItem(GsShapeType type,QRectF rectF,
                                                  QGraphicsObject *parent)
    {
        GsShapeBaseItem * item = nullptr;
        switch (type) {
        case Shape_Line:
            item = new GsShapeLineItem(rectF,parent);
            break;
        case Shape_Rectange:
            item = new GsShapeRectangeItem(rectF,parent);
            break;
        case Shape_Circle:
            item = new GsShapeCircleItem(rectF,parent);
            break;
        case Shape_Oval:
            item = new GsShapeOvalItem(rectF,parent);
            break;
        default:
            break;
        }
        item->setZValue(10);
        return item;
    }
    

    在工厂类中会创建不同的图形对象。每一个图形对象是继承于QGraphicsObject然后重写paint函数去进行绘制,比如说原型:

    void GsShapeCircleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        painter->setRenderHint(QPainter::Antialiasing);
        QColor color = Qt::red;//(rand()%255,rand()%255,rand()%255);
        painter->setBrush(color);
        if(m_bTap){
            painter->setPen(QPen(Qt::yellow,5,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
        }
        else{
            painter->setPen(QPen(color,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
        }
        painter->drawEllipse(m_firstPoint.x(),m_firstPoint.y(),
                             qAbs(m_lastPoint.y() - m_firstPoint.y()),
                             qAbs(m_lastPoint.y() - m_firstPoint.y()));
    }
    

    其他图形类似。

    实现图形的选择和拖动,需要在item中添加以下两句:

    setFlag(ItemIsSelectable,true);
    setFlag(ItemIsMovable,true);
    

    然后就可以自由拖动啦。

    代码太多, 就不全部列出来了,基本逻辑都很简单。
    代码下载地址

    github下载

    展开全文
  • 本文章主要总结用Qt5.9Creator创建一个画布和用鼠标在画布上拖拽出一个矩形的实例,具体的步骤如下所述: 1.1新建一个Widget工程,基类选择为QDialog。在Dialog.h头文件中添加如下代码: 1.2...

    本文章主要总结用Qt5.9Creator创建一个画布和用鼠标在画布上拖拽出一个矩形的实例,具体的步骤如下所述:


    1.1新建一个Widget工程,基类选择为QDialog。在Dialog.h头文件中添加如下代码:





    1.2在Widget.cpp的构造函数中,添加如下代码:


    1.3在Widget.cpp源文件中,添加如下代码:






    1.4程序构建执行后,结果如下图所示:

                             

    没有绘制矩形前的图


                             

    绘制矩形的结果图



    参考内容:

    http://www.qter.org/portal.php?mod=view&aid=46

    展开全文
  • 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。... 说实话,本来我是没有打算放一个很大的...这里我会只做出一个简单的画板程序,大体上就是能够画直线
    原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://devbean.blog.51cto.com/448512/243546
    说实话,本来我是没有打算放一个很大的例子的,一则比较复杂,二来或许需要很多次才能说得完。不过,现在已经说完了绘图部分,所以计划还是上一个这样的例子。这里我会只做出一个简单的画板程序,大体上就是能够画直线和矩形吧。这样,我计划分成两种实现,一是使用普通的QWidget作为画板,第二则是使用Graphcis View Framework来实现。因为前面有朋友说不大明白Graphics View的相关内容,所以计划如此。
     
    好了,现在先来看看我们的主体框架。我们的框架还是使用Qt Creator创建一个Gui Application工程。
     
    简单的main()函数就不再赘述了,这里首先来看MainWindow。顺便说一下,我一般不会使用ui文件,所以这些内容都是手写的。首先先来看看最终的运行结果:
     
     
    或许很简单,但是至少我们能够把前面所说的各种知识串连起来,这也就达到目的了。
     
    现在先来看看MainWindow的代码:
     
    mainwindow.h
    #ifndef MAINWINDOW_H 
    #define MAINWINDOW_H 
     
    #include <QtGui> 
     
    #include  "shape.h" 
    #include  "paintwidget.h" 
     
    class MainWindow :  public QMainWindow 

            Q_OBJECT 
     
    public
            MainWindow(QWidget *parent = 0); 
     
    signals: 
             void changeCurrentShape(Shape::Code newShape); 
     
    private slots: 
             void drawLineActionTriggered(); 
             void drawRectActionTriggered(); 
     
    }; 
     
    #endif  // MAINWINDOW_H
     
    mainwindow.cpp
    #include  "mainwindow.h" 
     
    MainWindow::MainWindow(QWidget *parent) 
            : QMainWindow(parent) 

            QToolBar *bar =  this->addToolBar( "Tools"); 
            QActionGroup *group =  new QActionGroup(bar); 
     
            QAction *drawLineAction =  new QAction( "Line", bar); 
            drawLineAction->setIcon(QIcon( ":/line.png")); 
            drawLineAction->setToolTip(tr( "Draw a line.")); 
            drawLineAction->setStatusTip(tr( "Draw a line.")); 
            drawLineAction->setCheckable( true); 
            drawLineAction->setChecked( true); 
            group->addAction(drawLineAction); 
     
            bar->addAction(drawLineAction); 
            QAction *drawRectAction =  new QAction( "Rectangle", bar); 
            drawRectAction->setIcon(QIcon( ":/rect.png")); 
            drawRectAction->setToolTip(tr( "Draw a rectangle.")); 
            drawRectAction->setStatusTip(tr( "Draw a rectangle.")); 
            drawRectAction->setCheckable( true); 
            group->addAction(drawRectAction); 
            bar->addAction(drawRectAction); 
     
            QLabel *statusMsg =  new QLabel; 
            statusBar()->addWidget(statusMsg); 
     
            PaintWidget *paintWidget =  new PaintWidget( this); 
            setCentralWidget(paintWidget); 
     
            connect(drawLineAction, SIGNAL(triggered()), 
                             this, SLOT(drawLineActionTriggered())); 
            connect(drawRectAction, SIGNAL(triggered()), 
                             this, SLOT(drawRectActionTriggered())); 
            connect( this, SIGNAL(changeCurrentShape(Shape::Code)), 
                            paintWidget, SLOT(setCurrentShape(Shape::Code))); 

     
    void MainWindow::drawLineActionTriggered() 

            emit changeCurrentShape(Shape::Line); 

     
    void MainWindow::drawRectActionTriggered() 

            emit changeCurrentShape(Shape::Rect); 

     
    应该说,从以往的学习中可以看出,这里的代码没有什么奇怪的了。我们在MainWindow类里面声明了一个信号,changeCurrentShape(Shape::Code),用于按钮按下后通知画图板。注意,QActio的triggered()信号是没有参数的,因此,我们需要在QAction的槽函数中重新emit我们自己定义的信号。构造函数里面创建了两个QAction,一个是drawLineAction,一个是drawRectAction,分别用于绘制直线和矩形。MainWindow的中心组件是PainWidget,也就是我们的画图板。下面来看看PaintWidget类:
     
    paintwidget.h
    #ifndef PAINTWIDGET_H 
    #define PAINTWIDGET_H 
     
    #include <QtGui> 
    #include <QDebug> 
    #include  "shape.h" 
    #include  "line.h" 
    #include  "rect.h" 
     
    class PaintWidget :  public QWidget 

            Q_OBJECT 
     
    public
            PaintWidget(QWidget *parent = 0); 
     
    public slots: 
             void setCurrentShape(Shape::Code s) 
            { 
                     if(s != currShapeCode) { 
                            currShapeCode = s; 
                    } 
            } 
     
    protected
             void paintEvent(QPaintEvent * event); 
             void mousePressEvent(QMouseEvent * event); 
             void mouseMoveEvent(QMouseEvent * event); 
             void mouseReleaseEvent(QMouseEvent * event); 
     
    private
            Shape::Code currShapeCode; 
            Shape *shape; 
             bool perm; 
            QList<Shape*> shapeList; 
    }; 
     
    #endif  // PAINTWIDGET_H 
     
    paintwidget.cpp
    #include  "paintwidget.h" 
     
    PaintWidget::PaintWidget(QWidget *parent) 
            : QWidget(parent), currShapeCode(Shape::Line), shape(NULL), perm( false

            setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 

     
    void PaintWidget::paintEvent(QPaintEvent * event

            QPainter painter( this); 
            painter.setBrush(Qt::white); 
            painter.drawRect(0, 0, size().width(), size().height()); 
             foreach(Shape * shape, shapeList) { 
                    shape->paint(painter); 
            } 
             if(shape) { 
                    shape->paint(painter); 
            } 

     
    void PaintWidget::mousePressEvent(QMouseEvent * event

             switch(currShapeCode) 
            { 
             case Shape::Line: 
                    { 
                            shape =  new Line; 
                             break
                    } 
             case Shape::Rect: 
                    { 
                            shape =  new Rect; 
                             break
                    } 
            } 
             if(shape != NULL) { 
                    perm =  false
                    shapeList<<shape; 
                    shape->setStart( event->pos()); 
                    shape->setEnd( event->pos()); 
            } 

     
    void PaintWidget::mouseMoveEvent(QMouseEvent * event

             if(shape && !perm) { 
                    shape->setEnd( event->pos()); 
                    update(); 
            } 

     
    void PaintWidget::mouseReleaseEvent(QMouseEvent * event

            perm =  true

     
    PaintWidget类定义了一个slot,用于接收改变后的新的ShapeCode。最主要的是,PaintWidget重定义了三个关于鼠标的事件:mousePressEvent,mouseMoveEvent和mouseReleaseEvent。
     
    我们来想象一下如何绘制一个图形:图形的绘制与鼠标操作息息相关。以画直线为例,首先我们需要按下鼠标,确定直线的第一个点,所以在mousePressEvent里面,我们让shape保存下start点。然后在鼠标按下的状态下移动鼠标,此时,直线就会发生变化,实际上是直线的终止点在随着鼠标移动,所以在mouseMoveEvent中我们让shape保存下end点,然后调用update()函数,这个函数会自动调用paintEvent()函数,显示出我们绘制的内容。最后,当鼠标松开时,图形绘制完毕,我们将一个标志位置为true,此时说明这个图形绘制完毕。
     
    为了保存我们曾经画下的图形,我们使用了一个List。每次按下鼠标时,都会把图形存入这个List。可以看到,我们在paintEvent()函数中使用了foreach遍历了这个List,绘制出历史图形。foreach是Qt提供的一个宏,用于遍历集合中的元素。
     
    最后我们来看看Shape类。
     
    shape.h
    #ifndef SHAPE_H 
    #define SHAPE_H 
     
    #include <QtGui> 
     
    class Shape 

    public
     
             enum Code { 
                    Line, 
                    Rect 
            }; 
     
            Shape(); 
     
             void setStart(QPoint s) 
            { 
                    start = s; 
            } 
     
             void setEnd(QPoint e) 
            { 
                    end = e; 
            } 
     
            QPoint startPoint() 
            { 
                     return start; 
            } 
     
            QPoint endPoint() 
            { 
                     return end; 
            } 
     
             void  virtual paint(QPainter & painter) = 0; 
     
    protected
            QPoint start; 
            QPoint end; 
    }; 
     
    #endif  // SHAPE_H 
     
    shape.cpp
    #include  "shape.h" 
     
    Shape::Shape() 


     
    Shape类最重要的就是保存了start和end两个点。为什么只要这两个点呢?因为我们要绘制的是直线和矩形。对于直线来说,有了两个点就可以确定这条直线,对于矩形来说,有了两个点作为左上角的点和右下角的点也可以确定这个矩形,因此我们只要保存两个点,就足够保存这两种图形的位置和大小的信息。paint()函数是Shape类的一个纯虚函数,子类都必须实现这个函数。我们现在有两个子类:Line和Rect,分别定义如下:
     
    line.h
    #ifndef LINE_H 
    #define LINE_H 
     
    #include  "shape.h" 
     
    class Line :  public Shape 

    public
            Line(); 
     
             void paint(QPainter &painter); 
    }; 
     
    #endif  // LINE_H 
     
    line.cpp
    #include  "line.h" 
     
    Line::Line() 


     
    void Line::paint(QPainter &painter) 

            painter.drawLine(start, end); 

     
    rect.h
    #ifndef RECT_H 
    #define RECT_H 
     
    #include  "shape.h" 
     
    class Rect :  public Shape 

    public
            Rect(); 
     
             void paint(QPainter &painter); 
    }; 
     
    #endif  // RECT_H 
     
    rect.cpp
    #include  "rect.h" 
     
    Rect::Rect() 


     
    void Rect::paint(QPainter &painter) 

            painter.drawRect(start.x(), start.y(), 
                                             end.x() - start.x(), end.y() - start.y()); 

     
    使用paint()函数,根据两个点的数据,Line和Rect都可以绘制出它们自身来。此时就可以看出,我们之所以要建立一个Shape作为父类,因为这两个类有几乎完全相似的数据对象,并且从语义上来说,Line、Rect与Shape也完全是一个is-a的关系。如果你想要添加颜色等的信息,完全可以在Shape类进行记录。这也就是类层次结构的好处。
    展开全文
  • QT 利用QPainter了一条线,这条线能随鼠标的拖曳而拖动吗?这个功能能实现吗,如果能,请问怎么实现。 2012-04-19 08:59 提问者: 小鬼恋书 |浏览次数:305次 我来帮他解答  满意回答 2012-04-19 11:09热心...
  • QT中通过操纵滚动条实现鼠标移动QGraphicsView的展示部分 第一次写 代码 void OCRGraphicsView::mouseMoveEvent(QMouseEvent *event) { Q_UNUSED(event) if (sign && m_IsMoveAble ) { QPointF newPos ...
  • 我一直很不明白为什么一直百度不到有关Qt鼠标拖动图形的代码,然后就各种蛋疼的坐定思考,整整两天,感觉人都不好了。现在很兴奋,刚刚终于把图形拖动雏形测试出来了,并且拖动时有痕迹,而且貌似可以完美的加到原来...
  • 读取显示stl和点云文件,鼠标拖动 任意角度旋转 背景:可能由于之前在做 读取显示stl文件和点云文件的项目时候,在各大博客网站留下了些许的踪迹。最近这一两天打开csdn的消息栏,突然发现有私信我。询问我读取stl...
  • ui->plot->graph()->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Qt::black, 1.5), QBrush(Qt::white), 9)); ui->plot->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom); connect(ui->...
  • Qt 绘制可以用鼠标拖动的线段(一) ...
  • 接着上一篇文章,这个主要实现了垂直,垂直于两个线段的直线交于一点,直接看效果: 原理: 一条线段由两个点P1(x1,y1),P2(x2,y2)组成,其中的这条线段所在的直线l1的斜率可求: k0 = (y2 - y1) / (x2 - x1) ...
  • QT 鼠标形状设置

    千次阅读 2017-11-02 16:02:48
    QT提供了十分便捷的设置鼠标形状的方法,在QT界面的根类QWidget中有QCursor cursor(); void setCursor(QCursor &); void unsetCursor()三个方法,因而对于一切直接或间接继承自QWidget的控件都可以设置鼠标进入控件...
  • Qt 通过重写QGraphicItem实现绘制、拖动、缩放、旋转矩形 1.实现绘制矩形:只要定义一个全局变量QRectF m_oldRect,在外面矩形大小传进来,然后在paint函数里面绘制这个矩形就行 2.实现拖动矩形:重写...
  • 考:类似于绘制直线段,按下鼠标左键时的点假设为 P,按住鼠标左 键不放,移动鼠标到另一点处抬起鼠标左键,该点假设为 Q。绘制圆 的时候,以 P 为圆心,PQ 为圆的半径。绘制椭圆时,将 PQ 作为一个 矩形的对角线,...
  • 直线卡尺: 圆形卡尺: 我主要是重写了QGraphicsItem类 头文件如下: #ifndef MYGRAPHICCALIPERITEM_H #define MYGRAPHICCALIPERITEM_H #include <QObject> #include <QWidget> #include <...
  • 如上图所示,绘制矩形之后,可以按住中间缩放、然后按住右侧中间进行旋转,按住右下角进行缩放,按住下方中间进行斜切矩形。 整体都是仿照visionpro里面...首先,切变主要使用qt里面的 QTransform &QTransform::s.
  • QDockWidget("Log", self) logDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea) self.listWidget = QListWidget() logDockWidget.setWidget(self.listWidget) self.addDockWidget(Qt....
  • Qt在透明QWidget上自由绘画

    千次阅读 热门讨论 2019-11-15 22:31:40
    文章目录Qt在透明控件上自由绘画如何让QWidget变透明透明QWidget上响应鼠标事件 初学Qt,需要实现这样的效果: 在透明的QWidget上自由的绘图,看起来就像是直接在桌面绘图一样。 要达到这样的效果,需要分成两个...
  • qt学习之个人画板的实现(3)

    千次阅读 2014-12-19 10:46:23
    昨晚又体验了一下双缓冲画图,我们来了解一下双缓冲在...(2)绘制直线,矩形等图形时有重影。 如图: (3)画布进行放大,旋转等操作后无法正常绘图。 应用坐标系的知识,在绘制图片时,当进行放大、拉伸等操作时,
  • Qt 之图形视图框架

    万次阅读 多人点赞 2016-07-20 16:59:13
    简述图形视图(Graphics View)提供了一个用于管理和交互大量自定义的二维图形...Items(图形元素)可以处理键盘事件、鼠标按下、移动、释放和双击事件,同时也能跟踪鼠标移动。Graphics View使用一个BSP(Binary Space
  • 我们可以把每个绘图事件定义一个类,因为都需要进行绘画,以及更新鼠标拖动结束点并且实时更新绘画效果,所以我们使用继承,即一个父类Figure,被重写的方法要加上virtual.如下 然后你要写哪种类型的图继承这个...
  • 在项目中使用QCustomPlot过程中,会有新的需求需要满足,比如在显示的数据表格中,鼠标移动到数据线上的时候,需要实时显示当前显示的线上点的具体数据;点击这条线的时候,弹出对话框展现出数据线段的详细信息。 ...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 313
精华内容 125
关键字:

qt拖动鼠标画直线