• 9628阅读
  • 7回复

qt 画圆 [复制链接]

上一主题 下一主题
离线无敌
 
只看楼主 倒序阅读 楼主  发表于: 2012-11-05
通过鼠标mousePressEvent事件得到起点坐标m_startPoint,通过mouseMoveEvent事件得到终点坐标m_endPoint,通过起点坐标,终点坐标得到一个矩形.
qreal x = m_endPoint.rx() - m_startPoint.rx()
qreal y = m_endPoint.ry() - m_startPoint.ry()  
qreal radius = qMin(x ,y );
怎么样以矩形中心(x/2, y/2)为圆点,以radius为半径画圆?
painter->drawEllipse(x/2, y/2 , radius, radius) 怎么画不出来呢?
结果是什么都画不出!请高手指教!不甚感激!
离线hehuim

只看该作者 1楼 发表于: 2012-11-05
你没贴代码不知道你哪里错了。自己写了个。可以不停的画,以前画的不丢失,不过都是画的椭圆。


---------------widget.h--------------------
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include <QPair>
  5. #include <QVector>
  6. class Widget : public QWidget
  7. {
  8.     Q_OBJECT
  9.     
  10. public:
  11.     Widget(QWidget *parent = 0);
  12.     ~Widget();
  13.     void mousePressEvent(QMouseEvent *);
  14.     void mouseMoveEvent(QMouseEvent *);
  15.     void paintEvent(QPaintEvent *);
  16. private:
  17.     bool m_mousePressFlag;
  18.     QPointF m_firstPoint;
  19.     QPointF m_secondPoint;
  20.     QVector<QPair<QPointF,QPointF> > m_circleVec;
  21. };
  22. #endif // WIDGET_H

----------------widget.cpp--------------------
  1. #include "widget.h"
  2. #include <QPainter>
  3. #include <QMouseEvent>
  4. #include <QDebug>
  5. Widget::Widget(QWidget *parent)
  6.     : QWidget(parent)
  7. {
  8.     resize(500,300);
  9.     m_mousePressFlag=false;
  10.     setMouseTracking(true);
  11. }
  12. Widget::~Widget()
  13. {
  14.     
  15. }
  16. void Widget::mousePressEvent(QMouseEvent *e){
  17.     if (e->button()==Qt::LeftButton && m_mousePressFlag==false){
  18.         m_mousePressFlag=true;
  19.         m_firstPoint=e->posF();
  20.         qDebug()<<m_firstPoint;
  21.     }
  22.     else if(e->button()==Qt::LeftButton && m_mousePressFlag==true){
  23.         m_mousePressFlag=false;
  24.         m_circleVec<<QPair<QPointF,QPointF>(m_firstPoint,m_secondPoint);
  25.     }
  26. }
  27. void Widget::mouseMoveEvent(QMouseEvent *e){
  28.     if (m_mousePressFlag==true){
  29.         m_secondPoint=e->posF();
  30.     }
  31.     update();
  32. }
  33. void Widget::paintEvent(QPaintEvent *){
  34.     QPainter painter(this);
  35.     for (int i=0;i<m_circleVec.size();++i){
  36.         painter.drawEllipse(QRect(m_circleVec[i].first.x(),m_circleVec[i].first.y(),\
  37.                                   m_circleVec[i].second.x()-m_circleVec[i].first.x(),\
  38.                                   m_circleVec[i].second.y()-m_circleVec[i].first.y()));
  39.     }
  40.     if (m_mousePressFlag){
  41.         painter.drawEllipse(QRect(m_firstPoint.x(),m_firstPoint.y(),\
  42.                                   m_secondPoint.x()-m_firstPoint.x(),\
  43.                                   m_secondPoint.y()-m_firstPoint.y()));
  44.     }
  45. }



离线无敌
只看该作者 2楼 发表于: 2012-11-06
回 1楼(hehuim) 的帖子
你好 我能实现画椭圆 就是不能实现画圆 按照上面我说的方法不能画出来!
离线hehuim

只看该作者 3楼 发表于: 2012-11-06
void QPainter::drawEllipse ( int x, int y, int width, int height )
这个函数中的x,y是椭圆/圆所占矩形的左上角点的坐标,以矩形中心(x/2, y/2)为圆点,以radius为半径画圆,应该是drawEllipse ( m_startPoint.rx() , m_startPoint.ry() , radius, radius),还有就是MouseTracking要设为True。
离线无敌
只看该作者 4楼 发表于: 2012-11-06
回 3楼(hehuim) 的帖子
如何得到所占矩形的中心点centerPoint,请赐教
离线hehuim

只看该作者 5楼 发表于: 2012-11-06
应该是这样吧(m_startPoint.rx()+x/2,m_startPoint.rx()+y/2)
离线无敌
只看该作者 6楼 发表于: 2012-11-08
回 5楼(hehuim) 的帖子
m_startPoint.rx()+x/2,m_startPoint.rx()+y/2 是矩形的中心点 但是我的意思是:怎么画使得m_startPoint.rx()+x/2,m_startPoint.rx()+y/2 成为圆的圆心 ?请赐教!
离线hehuim

只看该作者 7楼 发表于: 2012-11-08
Re:回 5楼(hehuim) 的帖子
引用第6楼无敌于2012-11-08 11:47发表的 回 5楼(hehuim) 的帖子 :
m_startPoint.rx()+x/2,m_startPoint.rx()+y/2 是矩形的中心点 但是我的意思是:怎么画使得m_startPoint.rx()+x/2,m_startPoint.rx()+y/2 成为圆的圆心 ?请赐教!

要不你直接把坐标原点移到圆心,然后再画啊
  1. painter.translate(m_startPoint.rx()+x/2,m_startPoint.rx()+y/2); //移动原点到圆心位置
  2. painter.drawEllipse(QPointF(0,0),radius,radius);//在圆心画圆








快速回复
限100 字节
 
上一个 下一个