希沃作为视频展台界的扛把子, 其软件有口皆碑, 这两天模仿了一下它的滑动按钮效果, 用qt来实现, 效果如下图:
现在把核心代码分享出来, 供有需要的朋友使用, 主要是用QPainterPath来填充一个两头圆的矩形和一个圆形的滑块:
void SliderButton::paintEvent(QPaintEvent* e)
{
QPainter painter(this);
QPainterPath path;
//抗锯齿
painter.setRenderHint(QPainter::Antialiasing, true);
QPoint pt(m_ltpos.x() + m_radius + m_margin, m_ltpos.y());
path.moveTo(pt);
pt.setX(m_ltpos.x() + 2*m_radius + m_margin*2);
pt.setY(m_ltpos.y() + 2*m_radius + m_margin*2);
path.arcTo(QRect(m_ltpos, pt), 90, 180);
pt.setX(pt.x() + m_len);
path.lineTo(pt);
pt.setY(m_ltpos.y());
QPoint pt1(pt.x() + 2*m_radius + m_margin, m_ltpos.y() + 2*m_radius + m_margin*2);
path.arcTo(QRect(pt, pt1), 270, 180);
pt.setX(m_ltpos.x() + m_radius + m_margin);
pt.setY(m_ltpos.y());
path.lineTo(pt);
painter.fillPath(path, QBrush(QColor(192, 192, 192)));
//painter.drawPath(path);
// draw small circle 绘制小圆圈
painter.setBrush(m_circle_color);
path.clear();
path.addEllipse(m_button_pos.x(), m_button_pos.y(), 2*m_radius, 2*m_radius);
painter.fillPath(path, m_circle_color);
QPoint p1(m_button_pos.x()+m_radius, m_button_pos.y()+m_radius-16);
QPoint p2(m_button_pos.x()+m_radius, m_button_pos.y()+m_radius+16);
painter.drawLine(p1, p2);
p1 = QPoint(m_button_pos.x()+m_radius+10, m_button_pos.y()+m_radius-10);
p2 = QPoint(m_button_pos.x()+m_radius+10, m_button_pos.y()+m_radius+10);
painter.drawLine(p1, p2);
p1 = QPoint(m_button_pos.x()+m_radius-10, m_button_pos.y()+m_radius-10);
p2 = QPoint(m_button_pos.x()+m_radius-10, m_button_pos.y()+m_radius+10);
painter.drawLine(p1, p2);
//painter.drawEllipse(m_button_pos.x(), m_button_pos.y(), m_radius, m_radius);
}
完整工程见:https://download.csdn.net/download/u010947464/89035419