由于对当前项目需要绘制一个箭头控件,所以使用了QPainter和QPolygon来进行绘制,原理就是计算填充,下面贴出代码和效果图
这里简单介绍下QPolygon
QPolygon是继承自
C++
QVector<QPoint>
那么可以很简单的理解为,他就是一个点的集合
所以由3个点就构成了一个箭头,当然更复杂的箭头大家可以自己去进行构建,由于我的项目需要的只是单纯箭头就展现如下代码,我还填充了一个矩形框作为背景。
C++
void arrowWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
int cornerRadius = qMin(this->width(), this->height()) / 10;
QRect rect(10, 10, this->width() - 20, this->height() - 20);
painter.setPen(Qt::NoPen);
painter.setBrush(QColor(85, 114, 128));
painter.drawRoundedRect(rect, cornerRadius, cornerRadius);
painter.setBrush(Qt::lightGray);
//drawcaricon(&painter);
if (leftArrow)
drawLeftArraow(&painter);
else
drawRightArrow(&painter);
}
void arrowWidget::drawLeftArraow(QPainter* painter)
{
QPoint center(this->width() / 2, this->height() / 2);
int arrowWidth = this->width() * 0.2;
int arrowHeight = this->height() * 0.2;
QPoint left(center.x() - arrowWidth, center.y());
QPoint top(center.x() + arrowWidth / 2, center.y() - arrowHeight);
QPoint bottom(center.x() + arrowWidth / 2, center.y() + arrowHeight);
QPolygon arrow;
arrow << left << top << bottom;
painter->drawPolygon(arrow);
}
void arrowWidget::drawRightArrow(QPainter* painter)
{
QPoint center(this->width() / 2, this->height() / 2);
int arrowWidth = this->width() * 0.2;
int arrowHeight = this->height() * 0.2;
QPoint right(center.x() + arrowWidth, center.y());
QPoint top(center.x() - arrowWidth / 2, center.y() - arrowHeight);
QPoint bottom(center.x() - arrowWidth / 2, center.y() + arrowHeight);
QPolygon arrow;
arrow << right << top << bottom;
painter->drawPolygon(arrow);
}
这是效果图,有需要其他操作的可以自己根据实际情况调整。