我有自定义QGraphicsView和QGraphicsScene。在QGraphicsScene内部我覆盖了void drawBackground(QPainter *painter, const QRectF &rect)并基于布尔标志我想要打开和关闭网格。我尝试在我的函数中调用clear()或调用painter eraseRect(sceneRect()),但它没有用。所以在做了一些阅读之后,我想它不应该工作,因为在更改场景后你需要刷新视图。这就是我发出名为signalUpdateViewport()的信号的原因
void Scene::drawBackground(QPainter *painter, const QRectF &rect) {
if(this->gridEnabled) {
// Draw grid
}
else {
// Erase using the painter
painter->eraseRect(sceneRect());
// or by calling
//clear();
}
// Trigger refresh of view
emit signalUpdateViewport();
QGraphicsScene::drawBackground(painter, rect);
}
然后由我的观点捕获:
void View::slotUpdateViewport() {
this->viewport()->update();
}
毋庸置疑,这并不奏效。 不起作用我的意思是只有在更改窗口小部件时才会显示结果(无论是场景内部还是视图内部的刷新),例如触发调整大小事件。
如何正确刷新场景视图以显示我在场景背景中所做的更改?
代码:
scene.h
#ifndef SCENE_HPP
#define SCENE_HPP
#include
class View;
class Scene : public QGraphicsScene
{
Q_OBJECT
Q_ENUMS(Mode)
Q_ENUMS(ItemType)
public:
enum Mode { Default, Insert, Select };
enum ItemType { None, ConnectionCurve, ConnectionLine, Node };
Scene(QObject* parent = Q_NULLPTR);
~Scene();
void setMode(Mode mode, ItemType itemType);
signals:
void signalCursorCoords(int x, int y);
void signalSceneModeChanged(Scene::Mode sceneMode);
void signalSceneItemTypeChanged(Scene::ItemType sceneItemType);
void signalGridDisplayChanged(bool g