如何更改 QGraphicsScene 中的背景颜色?
How to change background color in QGraphicsScene?
我想在我的 QGraphicsScene 中提供背景颜色。为此,我重写了 drawBackground() 方法,并尝试设置颜色,但它不起作用。背景颜色没有改变。
这是我的 drawBackground() 方法。
Widget.h
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QGraphicsView
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void drawBackground(QPainter *painter, const QRectF &rect);
};
Widget.cpp
Widget::Widget(QWidget *parent)
: QGraphicsView(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
view = new QGraphicsView(this);
view->setScene(scene);
view->setDragMode(QGraphicsView::RubberBandDrag);
ui->verticalLayout_2->addWidget(view);
}
void Widget::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->setBrush(QBrush(Qt::yellow));
painter->restore();
}
谁能帮帮我?
您的代码有很多问题,或者至少是不一致。首先,您的 Widget
class 使用继承 和 关于 QGraphicsView
的组合,因为它派生自 QGraphicsView
并且具有QGraphicsView
成员。这可能是您想要的,但似乎不太可能。
首先,你说...
I want to set background for the ui->verticalLayout_2. So my
background should be yellow.
根据我的评论,只需使用 QGraphicsView::setBackgroundBrush
...
即可轻松完成
view->setBackgroundBrush(Qt::yellow);
另一个问题是您在 Widget
class 中覆盖了 drawBackground
。目前你有...
void Widget::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->setBrush(QBrush(Qt::yellow));
painter->restore();
}
但这只是保存画家的状态,将画笔设置为纯黄色,然后恢复画家的状态。它本质上是一个 noop,因为它实际上并没有绘制任何东西。如果您真的想以这种方式覆盖 drawBackground
成员,请尝试类似...
void Widget::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(QBrush(Qt::yellow));
painter->drawRect(rect);
painter->restore();
}
[顺便说一句,在派生 class 中覆盖虚拟成员时,始终使用 override
说明符。]
我想在我的 QGraphicsScene 中提供背景颜色。为此,我重写了 drawBackground() 方法,并尝试设置颜色,但它不起作用。背景颜色没有改变。
这是我的 drawBackground() 方法。
Widget.h
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QGraphicsView
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void drawBackground(QPainter *painter, const QRectF &rect);
};
Widget.cpp
Widget::Widget(QWidget *parent)
: QGraphicsView(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
view = new QGraphicsView(this);
view->setScene(scene);
view->setDragMode(QGraphicsView::RubberBandDrag);
ui->verticalLayout_2->addWidget(view);
}
void Widget::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->setBrush(QBrush(Qt::yellow));
painter->restore();
}
谁能帮帮我?
您的代码有很多问题,或者至少是不一致。首先,您的 Widget
class 使用继承 和 关于 QGraphicsView
的组合,因为它派生自 QGraphicsView
并且具有QGraphicsView
成员。这可能是您想要的,但似乎不太可能。
首先,你说...
I want to set background for the ui->verticalLayout_2. So my background should be yellow.
根据我的评论,只需使用 QGraphicsView::setBackgroundBrush
...
view->setBackgroundBrush(Qt::yellow);
另一个问题是您在 Widget
class 中覆盖了 drawBackground
。目前你有...
void Widget::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->setBrush(QBrush(Qt::yellow));
painter->restore();
}
但这只是保存画家的状态,将画笔设置为纯黄色,然后恢复画家的状态。它本质上是一个 noop,因为它实际上并没有绘制任何东西。如果您真的想以这种方式覆盖 drawBackground
成员,请尝试类似...
void Widget::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(QBrush(Qt::yellow));
painter->drawRect(rect);
painter->restore();
}
[顺便说一句,在派生 class 中覆盖虚拟成员时,始终使用 override
说明符。]