QGraphicsRectItem 设置边框的颜色,初始化的时候就用这种颜色

在 Qt 中,QGraphicsRectItem 本身不提供直接设置边框颜色的功能。但是,你可以通过继承 QGraphicsRectItem 并重写其 paint() 方法来自定义边框颜色,或者在创建 QGraphicsRectItem 后,使用 QGraphicsScene 的 addRect 方法,该方法允许你指定边框颜色和填充颜色。

如果你想要在初始化的时候就设置边框颜色,可以通过以下两种方式之一来实现:

方法一:继承 QGraphicsRectItem

  1. 创建一个新的类 继承自 QGraphicsRectItem

  2. 重写 paint() 方法 来绘制具有特定边框颜色的矩形。

class CustomRectItem : public QGraphicsRectItem {  
public:  
    CustomRectItem(QRectF rect, QGraphicsItem *parent = nullptr)  
        : QGraphicsRectItem(rect, parent) {  
        // 设置边框颜色  
        borderColor = Qt::red;  
    }  
  
protected:  
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {  
        QPen pen(borderColor);  
        painter->setPen(pen);  
        painter->setBrush(Qt::NoBrush); // 不填充内部  
        painter->drawRect(rect());  
    }  
  
private:  
    QColor borderColor;  
};

方法二:使用 QGraphicsScene 的 addRect 方法

当你创建 QGraphicsRectItem 时,可以直接使用 QGraphicsScene 的 addRect 方法,并指定边框颜色和填充颜色。

QGraphicsScene *scene = new QGraphicsScene();  
QRectF rect(0, 0, 100, 100);  
QGraphicsRectItem *rectItem = scene->addRect(rect, QPen(Qt::red), QBrush(Qt::NoBrush));

在这个例子中,QPen(Qt::red) 设置了边框颜色为红色,而 QBrush(Qt::NoBrush) 表示矩形内部不填充。

你可以根据自己的需求选择适合的方法。如果你需要更多的自定义选项(比如边框宽度、样式等),可以选择方法一。如果你只是需要简单地设置边框颜色,方法二可能更方便快捷。

设置QGraphicsScene,可以影响内部QGraphicsRectItem的边框颜色吗 

在 Qt 中,QGraphicsScene 本身并不直接控制其内部 QGraphicsRectItem 的边框颜色。QGraphicsScene 是一个用于管理和显示图形项的容器,而 QGraphicsRectItem 是场景中的一个具体图形项。每个 QGraphicsRectItem 都有自己的属性和样式,包括边框颜色,这些属性是独立于场景的。

要设置 QGraphicsRectItem 的边框颜色,你需要在创建或更新矩形项时指定。这通常是通过 QPen 对象来完成的,QPen 定义了线条的颜色、宽度和样式。

例如,当你创建一个 QGraphicsRectItem 时,你可以这样设置边框颜色:

QRectF rect(0, 0, 100, 100);  
QPen pen(Qt::red); // 设置红色边框  
QGraphicsRectItem *rectItem = scene->addRect(rect, pen);

在这个例子中,pen 对象被设置为红色,然后传递给 addRect 方法来创建带有红色边框的矩形项。

如果你想要在运行时更改已存在的 QGraphicsRectItem 的边框颜色,你需要获取对该项的引用,并更新其使用的 QPen 对象。这通常涉及到重写项的 paint() 方法(如果你继承了 QGraphicsRectItem)或者在项创建时保存对 QPen 的引用,以便后续修改。

如果你想要通过场景来间接影响项的属性,你可以考虑以下策略:

  1. 使用自定义属性:在 QGraphicsRectItem 上设置自定义属性,并在场景的事件处理中检查并修改这些属性。
  2. 信号和槽:通过信号和槽机制,在场景中触发信号来改变项的属性。例如,你可以定义一个信号来通知项改变其边框颜色。
  3. 遍历场景中的项:通过遍历场景中的所有项并检查它们的类型,你可以找到特定的 QGraphicsRectItem 实例并直接修改它们的属性。

总的来说,虽然 QGraphicsScene 不直接控制其内部项的边框颜色,但你可以通过上述方法来间接地影响这些属性。

 QGraphicsRectItem 边框的初始颜色是由什么决定的

在 Qt 中,QGraphicsRectItem 的边框初始颜色并不是由 QGraphicsScene 决定的,而是由创建 QGraphicsRectItem 时所指定的 QPen 对象决定的。QPen 定义了绘制线条(包括矩形边框)时所使用的颜色、宽度、线条样式等属性。

当你使用 QGraphicsScene 的 addRect 方法创建一个 QGraphicsRectItem 时,你可以传递一个 QPen 对象来指定边框的样式。例如:

QRectF rect(0, 0, 100, 100);
QPen pen(Qt::blue); // 设置蓝色边框
QGraphicsRectItem *rectItem = scene->addRect(rect, pen);

在这个例子中,pen 被设置为蓝色,因此创建的 QGraphicsRectItem 将具有蓝色的边框。

如果你没有显式地传递一个 QPen 对象,那么 QGraphicsRectItem 将使用默认的 QPen,这通常意味着没有边框或者边框颜色为黑色,具体取决于 Qt 的默认设置。

如果你是在代码中直接创建 QGraphicsRectItem 的实例,而不是通过 QGraphicsScene 的 addRect 方法,那么你需要在绘制项时(例如在重写的 paint() 方法中)指定 QPen

总的来说,QGraphicsRectItem 边框的初始颜色是由创建项时所提供的 QPen 对象决定的。如果你没有提供 QPen,那么将使用默认设置。

 

void ChartBaseView::checkAndUpdateRange(QPointF point) { double valuex = point.x(); double valuey = point.y(); QValueAxis *axisX = dynamic_cast<QValueAxis*>(m_chart->axisX()); QValueAxis *axisY = dynamic_cast<QValueAxis*>(m_chart->axisY()); double xmin = axisX->min(); double xmax = axisX->max(); double ymin = axisY->min(); double ymax = axisY->max(); // 当数据点为正数,且x轴最小值为默认0时,向上调整x轴最小值 if(valuex > 0 && xmin == 0) setRangeX(valuex, valuex+1); // 超出时更新坐标轴范围 if(valuex < xmin) this->setRangeX(valuex, xmax); else if(valuex > xmax) this->setRangeX(xmin, valuex); if(valuey < ymin) this->setRangeY(valuey, ymax); else if(valuey > ymax) this->setRangeY(ymin, valuey); } void ChartBaseView::mouseMoveEvent(QMouseEvent *pEvent) { // 检查并初始化状态变量,防止被图例点击干扰 if (!pEvent->buttons()) { m_bMiddleButtonPressed = false; m_bLeftButtonPressed = false; } // 鼠标中键按下时,拖动图表 if (m_bMiddleButtonPressed) { QPoint oDeltaPos = pEvent->pos() - m_oPrePos; this->chart()->scroll(-oDeltaPos.x(), oDeltaPos.y()); m_oPrePos = pEvent->pos(); } // 鼠标左键按下时,绘制矩形 if (m_bLeftButtonPressed) { m_oEndPoint = pEvent->pos(); QRectF rect(m_oStartPoint, m_oEndPoint); m_oRectItem->setRect(rect.normalized()); // 处理矩形可能的负宽高 } // 绘制线 x_line->setLine(pEvent->x(),0,pEvent->x(),this->height()); y_line->setLine(0,pEvent->y(),this->width(),pEvent->y()); QChartView::mouseMoveEvent(pEvent); // 调用基类的方法 } void ChartBaseView::mousePressEvent(QMouseEvent *pEvent) { // 鼠标中键按下 if (pEvent->button() == Qt::MiddleButton) { m_bMiddleButtonPressed = true; m_oPrePos = pEvent->pos(); this->setCursor(Qt::OpenHandCursor); } // 鼠标左键按下 if (pEvent->button() == Qt::LeftButton) { m_bLeftButtonPressed = true; m_oStartPoint = pEvent->pos(); m_oEndPoint = m_oStartPoint; // 初始化矩形绘制 if (!m_oRectItem) { m_oRectItem = new QGraphicsRectItem(); // 设置线条样式 QPen pen; pen.setColor(QColor(84, 224, 255)); // 设置线条颜色 pen.setStyle(Qt::DashLine); // 设置为虚线 m_oRectItem->setPen(pen); QColor color; color.setRgb(181, 229, 255, 25); m_oRectItem->setBrush(color); // 设置填充颜色 m_oRectItem->setZValue(10); // 设置层级 this->chart()->scene()->addItem(m_oRectItem); } m_oRectItem->setRect(QRectF(m_oStartPoint, QSize())); m_oRectItem->setVisible(true); } QChartView::mousePressEvent(pEvent); // 调用基类的方法 } void ChartBaseView::mouseReleaseEvent(QMouseEvent *pEvent) { // 鼠标中键释放 if (pEvent->button() == Qt::MiddleButton) { m_bMiddleButtonPressed = false; this->setCursor(Qt::ArrowCursor); } // 鼠标左键释放 if (pEvent->button() == Qt::LeftButton && m_bLeftButtonPressed) { m_bLeftButtonPressed = false; m_oEndPoint = pEvent->pos(); // 对最终的矩形区域进行处理,转换为数据坐标 QRectF dataRect = QRectF(this->chart()->mapToValue(m_oStartPoint), this->chart()->mapToValue(m_oEndPoint)).normalized(); emit rectangleDrawn(dataRect); // 发出信号传递绘制完成的矩形 // 获取矩形的 x 值范围 double xmin = dataRect.left(); double xmax = dataRect.right(); // 设置 x 轴范围 this->setRangeX(xmin, xmax); // 隐藏矩形 m_oRectItem->setVisible(false); } QChartView::mouseReleaseEvent(pEvent); // 调用基类的方法 }
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值