Qt:改变Item的选中时的边框

1059 篇文章 285 订阅
void  RectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QStyleOptionGraphicsItem op;
    op.initFrom(widget);

//     // 判断选中时,设置状态为 State_None
    if (option->state & QStyle::State_Selected){


        qreal itemPenWidth = 10;
        const qreal pad = itemPenWidth / 2;
        const qreal penWidth = 0;

        // 边框区域颜色
        QColor color = QColor(Qt::red);

        //绘制实现
        painter->setPen(QPen(color, penWidth, Qt::SolidLine));
        painter->setBrush(Qt::NoBrush);
        painter->drawRect(boundingRect().adjusted(pad, pad, -pad, -pad));

        // 绘制虚线
        painter->setPen(QPen(color, 0, Qt::DashLine));
        painter->setBrush(Qt::NoBrush);
        painter->drawRect(boundingRect().adjusted(pad, pad, -pad, -pad));
        qDebug() << "选中";
    }else{

    }

    //绘制图标,必须小于边框矩形
    painter->setRenderHint( QPainter::Antialiasing );
    painter->drawRect(m_x, m_y, m_w, m_h);



}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QGraphicsItemQt中的一个重要的图形项类,用于在QGraphicsScene中显示图形元素。要实现选中QGraphicsItem后出现可拉伸的边框,可以通过以下代码示例实现: ```cpp #include <QGraphicsItem> #include <QPainter> #include <QStyleOptionGraphicsItem> #include <QKeyEvent> class ResizableItem : public QGraphicsItem { public: ResizableItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent), m_isSelected(false), m_borderColor(Qt::red), m_borderWidth(2), m_resizeHandleSize(6) { setFlags(QGraphicsItem::ItemIsSelectable); } QRectF boundingRect() const override { return QRectF(0, 0, 100, 100); } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override { Q_UNUSED(option); Q_UNUSED(widget); painter->setRenderHint(QPainter::Antialiasing); // 绘制选中边框 if (m_isSelected) { painter->setPen(QPen(m_borderColor, m_borderWidth)); painter->setBrush(Qt::NoBrush); painter->drawRoundedRect(boundingRect(), 5, 5); // 绘制调整大小的手柄 painter->setBrush(Qt::SolidPattern); painter->setPen(Qt::NoPen); painter->drawRect(boundingRect().topRight().x() - m_resizeHandleSize / 2, boundingRect().topRight().y() - m_resizeHandleSize / 2, m_resizeHandleSize, m_resizeHandleSize); } // 绘制图形元素内容 painter->setPen(Qt::black); painter->setBrush(QColor(192, 192, 192)); painter->drawRoundedRect(0, 0, 100, 100, 5, 5); } void setSelected(bool selected) { m_isSelected = selected; update(); } protected: void keyPressEvent(QKeyEvent *event) override { if (event->key() == Qt::Key_Delete) { scene()->removeItem(this); delete this; } } void mousePressEvent(QGraphicsSceneMouseEvent *event) override { // 仅在点击图形元素选中 if (event->button() == Qt::LeftButton) { setSelected(true); event->accept(); } else { setSelected(false); event->ignore(); } } private: bool m_isSelected; QColor m_borderColor; int m_borderWidth; int m_resizeHandleSize; }; ``` 以上示例代码定义了一个基于QGraphicsItem的可拉伸项(ResizableItem),并重写了paint()函数以绘制图形和选中边框,重写了mousePressEvent()函数以实现点击图形元素选中的功能,以及重写了keyPressEvent()函数以实现删除选中项的功能。 你可以将这段代码插入进自己的Qt项目中,然后在场景中添加ResizableItem即可实现选中出现可拉伸的边框的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值