• 1089阅读
  • 0回复

QPainter 在鼠标移动到指定区域时,重绘背景。 [复制链接]

上一主题 下一主题
离线lwei24
 

只看楼主 倒序阅读 楼主  发表于: 2022-06-15
如题,在QWidget里重写QPainter后,画了一个双环圆,假设外圆半径为R1,内圆半径为R2,如何实现鼠标移动到外圆和内圆之间的区域,即R1-R2之间的区域时,这个区域就会改变颜色呢?具体代码如下:
  1. void CWidget::paintEvent(QPaintEvent *event)
  2. {
  3.     Q_UNUSED(event);
  4.     int m_radius = 61
  5.     QPainter painter(this);
  6.     painter.setRenderHint(QPainter::Antialiasing, true);
  7.     int arcHeight = 16;//30;
  8.     painter.translate(width()/2, this->height()*44/100);
  9.     QColor color("#95DE64");    Q_UNUSED(color);
  10.     this->drawCircle(&painter, m_radius, 0, 360, arcHeight, qRgb(149, 222, 100));
  11. }
  12. void CWidget::drawCircle(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color)
  13. {
  14.     painter->setBrush(QColor(color));
  15.     // << 1(左移1位)相当于radius*2 即:150*2=300
  16.     //QRectF(-150, -150, 300, 300)
  17.     QRectF rect(-radius, -radius, radius << 1, radius << 1);
  18.     QPainterPath path;
  19.     path.arcTo(rect, startAngle, angleLength);
  20.     // QRectF(-120, -120, 240, 240)
  21.     QPainterPath subPath;
  22.     subPath.addEllipse(rect.adjusted(arcHeight, arcHeight, -arcHeight, -arcHeight));
  23.     // path为扇形 subPath为椭圆
  24.     path -= subPath;
  25.     painter->setPen(Qt::NoPen);
  26.     painter->drawPath(path);
  27. }
  28. void CWidget::mousePressEvent(QMouseEvent *event)
  29. {
  30.     //鼠标按压时,外圆和内圆区域R1-R2改变颜色
  31. }
  32. void CWidget::mouseMoveEvent(QMouseEvent *event)
  33. {
  34.     //鼠标移动时,外圆和内圆区域R1-R2改变颜色
  35. }
  36. void CWidget::mouseReleaseEvent(QMouseEvent *event)
  37. {
  38.     //鼠标释放时,外圆和内圆区域R1-R2恢复原来的颜色
  39. }



请问各位大佬们,怎么才能判断鼠标移动到外圆和内圆R1-R2区域,并实现当鼠标在R1-R2区域内的时候,改变这个颜色,不在的时候,就恢复原来的颜色?


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