printf_dead 2022-07-01 02:13 采纳率: 0%
浏览 79
已结题

QGraphiceitem 添加阴影后的问题

节点类继承QGraphicsObject
圆点的部分代码

portItem::portItem(portItem::PortTypes type, int posY,int posX, uint num, QColor color, QGraphicsItem *parent) : QGraphicsObject(parent),
m_posY(posY),
m_posX(posX),
m_size(QSize(12,12)),
m_color(color),
m_number(num),
m_ellipseRadius(5),
m_isHovered(false),
m_portPos(mapToScene(QPointF(0,0))),
m_type(type)
{
setAcceptHoverEvents(true);
setFlags(ItemIsSelectable);

}
QRectF portItem::boundingRect() const
{
return QRectF(0, 0, m_size.width(), m_size.height());
}

QPainterPath portItem::shape() const
{
QPainterPath path;
path.addRect(0, 0, m_size.width(), m_size.height());
return path;
}

void portItem::paint(QPainter *p, const QStyleOptionGraphicsItem *item, QWidget *widget)
{
Q_UNUSED(widget);//避免编译报错而已没啥用
Q_UNUSED(item);
//设置抗锯齿
p->setRenderHint(QPainter::Antialiasing);

p->setBrush(QBrush(m_color));

if (m_isHovered)
    p->setPen(QPen(m_color,1));
else p->setPen(QPen(QColor::fromRgb(0,0,0,100),1));

//QPointF portPos = QPointF(m_size.width()/2+40,-m_size.height()+m_ellipseRadius);
QPointF portPos = QPointF(m_size.width()/2+90,-m_ellipseRadius);
p->drawEllipse(portPos,m_ellipseRadius,m_ellipseRadius);
setZValue(4);
calculatePosition();

}

添加QGraphicsDropShadowEffect 后 其他的图元被部分隐藏了
QGraphicsProxyWidget* proxyWidget = new QGraphicsProxyWidget(this);
// 设置阴影边框;
QGraphicsDropShadowEffect *m_pShadowEffect = new QGraphicsDropShadowEffect();

// 阴影偏移
m_pShadowEffect->setOffset(4, 4);
// 阴影颜色;
m_pShadowEffect->setColor(QColor(0,0,0,255));
// 阴影半径;
m_pShadowEffect->setBlurRadius(8);
// 窗口上的所有控件使用当前的阴影效果;
setGraphicsEffect(m_pShadowEffect);

qDebug()<<this->boundingRect()<<this->shape();
proxyWidget->setWidget(widget);
//proxyWidget->setZValue(0);
setZValue(0);
//setFlags(ItemIsSelectable | ItemIsMovable | ItemSendsGeometryChanges | ItemClipsChildrenToShape);
setFlags(ItemIsSelectable | ItemIsMovable | ItemSendsGeometryChanges);
setCacheMode(DeviceCoordinateCache);
setAcceptHoverEvents(true);
结果是这样的

img

尝试过改变他的 boundrect 和 shape 但是没什么用

void MyNode::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
Q_UNUSED(widget);

bool isSelected = false;

if (option->state & QStyle::State_Selected)
    isSelected = true;

QPen pen;
pen.setStyle(Qt::DashDotLine);
pen.setWidth(1);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::RoundJoin);
pen.setBrush(QColor::fromRgb(0, 0, 0, 0));

painter->setPen(pen);

painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);




QRadialGradient gradient_0(m_size.height()/2+30,m_size.width()/2-30,m_size.width());

gradient_0.setColorAt(0,QColor("#2C5364"));
gradient_0.setColorAt(0.4,QColor("#203A43"));
gradient_0.setColorAt(0.6,QColor("#0F2027"));

painter->setBrush(gradient_0);
painter->drawRoundedRect(2,1,m_size.width()-4,m_size.height()-2,
                   (qreal)m_size.width()/((qreal)m_size.width()/6),
                   (qreal)m_size.height()/((qreal)m_size.height()/6));

if (isSelected) {
    pen.setWidth(2);
    pen.setBrush(QColor::fromRgb(200, 80, 20, 255));
    setZValue(2);
}
else {
    pen.setWidth(1);
    pen.setBrush(QColor::fromRgb(0, 0, 0, 170));
    setZValue(1);
}

}

想要最终的效果是 顶上的小圆点可以正常点击和显示
  • 写回答

1条回答 默认 最新

  • 木风可可 2022-07-01 16:38
    关注

    没看懂你想要干什么

    评论

报告相同问题?

问题事件

  • 系统已结题 7月9日
  • 修改了问题 7月1日
  • 创建了问题 7月1日

悬赏问题

  • ¥20 cs184中路径追踪关于对光源采样的问题
  • ¥15 ubuntu进不了系统已尝试修改grub未解决
  • ¥15 ER3100G2,路由器固件
  • ¥15 sqlchat 部署后,访问不了在线网络
  • ¥100 yahoo finance api 2024年更改访问限制後的 java串接方法
  • ¥15 急,问问用stm32该怎么写,该怎么实现?
  • ¥15 节日彩灯电路设计电路图
  • ¥15 esp32cam串口图传
  • ¥15 C# 用partial定义部分类无法快速预览代码
  • ¥15 fastreport 代码无法设置最后一页横线不显示