画一个里面有数字的实心圆
Draw a filled circle with number inside
我想画一个未填充的圆圈,当用户点击它时,它应该被填充。圈内我想写个位数。
我尝试了 QPixmap、QLabel 和一些 QPainterPath 来让它工作,但我无法这样做。
我怎样才能做到这一点?
我需要圆圈没有背景,只圈自己,里面有一个数字。圆圈内部的填充是可选的,一次填充颜色,一次不填充。请指教
假设您正在处理 QGraphicsWidget
,您必须覆盖 QGraphicsWidget::paint(QPainter *, QStyleOptionGraphicsItem const*, QWidget *)
。使您的 pressed
私有成员变量并在 mousePressEvent()
和 mouseReleaseEvent()
.
中更改它
在画图功能中,使用painter->setPen()
设置边框,使用painter->setBrush()
设置填充属性。使用 painter->drawEllipse()
绘制圆,使用 QTextOption
绘制 painter->drawText()
并设置对齐。您还必须覆盖 boundingRect()
并使其成为小部件的 return 边界,并在绘制函数中使用它。
或者,如果它是常规小部件,则覆盖 paintEvent()
,创建 QPainter
并将小部件作为父级并使用 size()
矩形绘制。
希望对你有帮助,告诉我结果。
这通过子类化 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();
}
我想画一个未填充的圆圈,当用户点击它时,它应该被填充。圈内我想写个位数。
我尝试了 QPixmap、QLabel 和一些 QPainterPath 来让它工作,但我无法这样做。 我怎样才能做到这一点?
我需要圆圈没有背景,只圈自己,里面有一个数字。圆圈内部的填充是可选的,一次填充颜色,一次不填充。请指教
假设您正在处理 QGraphicsWidget
,您必须覆盖 QGraphicsWidget::paint(QPainter *, QStyleOptionGraphicsItem const*, QWidget *)
。使您的 pressed
私有成员变量并在 mousePressEvent()
和 mouseReleaseEvent()
.
在画图功能中,使用painter->setPen()
设置边框,使用painter->setBrush()
设置填充属性。使用 painter->drawEllipse()
绘制圆,使用 QTextOption
绘制 painter->drawText()
并设置对齐。您还必须覆盖 boundingRect()
并使其成为小部件的 return 边界,并在绘制函数中使用它。
或者,如果它是常规小部件,则覆盖 paintEvent()
,创建 QPainter
并将小部件作为父级并使用 size()
矩形绘制。
希望对你有帮助,告诉我结果。
这通过子类化 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();
}