在里面画一个带数字的实心圆圈

时间:2015-01-04 21:14:18

标签: c++ qt

我想绘制一个未填充的圆圈,当用户点击它时,它应该被填充。在圈内我想写一个数字。

我尝试使用QPixmap,QLabel和一些QPainterPath来使其工作,但我无法这样做。 我怎样才能做到这一点?

我需要圆圈没有背景,只有圈内有一个数字。填充圆圈内部是可选的,一次填充颜色,一次没有。请指教。

2 个答案:

答案 0 :(得分:1)

通过子类化QWidget,这非常简单,如下面的示例代码所示:

#include <QApplication>
#include <QMouseEvent>
#include <QWidget>
#include <QPainter>

class CircleWidget : public QWidget
{
public:
   CircleWidget(int number) : _number(number), _fill(false) {/*empty*/}

   virtual void paintEvent(QPaintEvent * e)
   {
      e->accept();

      QPainter p(this);

      QRect r = rect();
      p.setPen(Qt::black);
      if (_fill) p.setBrush(Qt::green);
      p.drawEllipse(r);

      p.drawText(r, Qt::AlignCenter, QString("%1").arg(_number));
   }

   virtual void mousePressEvent(QMouseEvent * e)
   {
      _fill = !_fill;
      update();  // this will induce another call to paintEvent() ASAP
      e->accept();
   }

private:
   const int _number;
   bool _fill;
};

int main(int argc, char ** argv)
{
   QApplication app(argc, argv);

   CircleWidget cw(5);
   cw.resize(60,60);
   cw.show();
   return app.exec();
}

答案 1 :(得分:0)

假设您正在使用QGraphicsWidget,则必须覆盖QGraphicsWidget::paint(QPainter *, QStyleOptionGraphicsItem const*, QWidget *)。制作pressed私有成员变量,并在mousePressEvent()mouseReleaseEvent()中进行更改。

在绘画功能中,使用painter->setPen()设置边框,使用painter->setBrush()设置填充属性。使用painter->drawEllipse()绘制圆圈,使用painter->drawText()绘制带有对齐设置的QTextOption。您还必须覆盖boundingRect()并使其返回窗口小部件的边界,并在绘图函数中使用它。

或者,如果是常规窗口小部件,请覆盖paintEvent(),创建QPainter,将窗口小部件设为父级,并使用size()矩形绘制。

希望它有所帮助,让我知道结果。