QGraphicsScene::fitInView() 仅适用于调整大小
QGraphicsScene::fitInView() only works on resizing
我有一个发生在静态地图之上的游戏。我想在 QGraphicsView::drawBackground().
中绘制地图
一切似乎都在膨胀。除了除非我做 window 调整大小,否则不会绘制任何东西...我认为它与 QGraphicsScene::fitInView()
或相关的东西有关...
我的mapscene.cpp
#include "mapscene.h"
#include <qpainter.h>
#include <iostream>
static const float WIDTH = 800.f;
static const float HEIGHT = 480.f;
static const float _map[][2] = {
{ 0, 0 },
{ 1, 1 },
// { 1, 0 }, // TEMP: coordinates of map
// { 0, 1 },
// { 0, 0 },
};
MapScene::MapScene() : QGraphicsScene(0, 0, WIDTH, HEIGHT)
{
mapPath.moveTo(_map[0][0], _map[0][0]);
int len = sizeof(_map)/sizeof(float)/2;
std::cout << len << std::endl;
for(int i = 1; i < len; i++)
mapPath.lineTo(QPointF(_map[i][0]*WIDTH, _map[i][1]*HEIGHT));
}
void MapScene::drawBackground(QPainter *painter, const QRectF &)
{
std::cout << "draw background" << std::endl;
painter->drawPath(mapPath);
}
我的mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include "mapscene.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
MapScene *scene = new MapScene();
ui->graphicsView->setScene(scene);
resizeEvent(0);
}
void MainWindow::resizeEvent(QResizeEvent *)
{
QRectF bounds = ui->graphicsView->scene()->sceneRect();
ui->graphicsView->fitInView(bounds, Qt::KeepAspectRatio);
ui->graphicsView->centerOn(bounds.center());
std::cout << "resize - scene rect: " << ui->graphicsView->sceneRect().width() << " x " << ui->graphicsView->sceneRect().height() << std::endl;
}
MainWindow::~MainWindow()
{
delete ui;
}
我正在使用 Qt 5.5.1 (Ubuntu)。
编辑: 我已经按照@LogicStuff 的建议将 \n
更改为 std::endl
,现在打印了消息,所以 drawBackground()
接到电话。问题似乎出在 QGraphicsView::fitInView()
和 QGraphicsView::centerOn()
上。我相应地更改了 post。
由于大部分时间背景不会改变,因此默认使用 QGraphicsView::CacheBackground
进行缓存。您有两个选择:
- 使用
view.setCacheMode(QGraphicsView::CacheNone);
,但可能降低性能
- 每次需要时在背景图层上使用
invalidate(const QRectF & rect = QRectF(), SceneLayers layers = AllLayers)
。
即使第二个实现起来有点棘手,但出于性能和 CPU 懒惰的考虑,我还是推荐它。
一个问题是 MainWindow::drawBackground
中的 std::cout << "draw background\n";
没有刷新 std::cout
。另一方面,由于 std::endl
.
,std::cout
在 MainWindow::resizeEvent
中被刷新
使用std::endl
或\n
和std::flush
。
问题是 ui->graphicsView->fitInView(bounds, Qt::KeepAspectRatio);
在小部件实际显示之前不应调用:
我有一个发生在静态地图之上的游戏。我想在 QGraphicsView::drawBackground().
中绘制地图一切似乎都在膨胀。除了除非我做 window 调整大小,否则不会绘制任何东西...我认为它与 QGraphicsScene::fitInView()
或相关的东西有关...
我的mapscene.cpp
#include "mapscene.h"
#include <qpainter.h>
#include <iostream>
static const float WIDTH = 800.f;
static const float HEIGHT = 480.f;
static const float _map[][2] = {
{ 0, 0 },
{ 1, 1 },
// { 1, 0 }, // TEMP: coordinates of map
// { 0, 1 },
// { 0, 0 },
};
MapScene::MapScene() : QGraphicsScene(0, 0, WIDTH, HEIGHT)
{
mapPath.moveTo(_map[0][0], _map[0][0]);
int len = sizeof(_map)/sizeof(float)/2;
std::cout << len << std::endl;
for(int i = 1; i < len; i++)
mapPath.lineTo(QPointF(_map[i][0]*WIDTH, _map[i][1]*HEIGHT));
}
void MapScene::drawBackground(QPainter *painter, const QRectF &)
{
std::cout << "draw background" << std::endl;
painter->drawPath(mapPath);
}
我的mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include "mapscene.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
MapScene *scene = new MapScene();
ui->graphicsView->setScene(scene);
resizeEvent(0);
}
void MainWindow::resizeEvent(QResizeEvent *)
{
QRectF bounds = ui->graphicsView->scene()->sceneRect();
ui->graphicsView->fitInView(bounds, Qt::KeepAspectRatio);
ui->graphicsView->centerOn(bounds.center());
std::cout << "resize - scene rect: " << ui->graphicsView->sceneRect().width() << " x " << ui->graphicsView->sceneRect().height() << std::endl;
}
MainWindow::~MainWindow()
{
delete ui;
}
我正在使用 Qt 5.5.1 (Ubuntu)。
编辑: 我已经按照@LogicStuff 的建议将 \n
更改为 std::endl
,现在打印了消息,所以 drawBackground()
接到电话。问题似乎出在 QGraphicsView::fitInView()
和 QGraphicsView::centerOn()
上。我相应地更改了 post。
由于大部分时间背景不会改变,因此默认使用 QGraphicsView::CacheBackground
进行缓存。您有两个选择:
- 使用
view.setCacheMode(QGraphicsView::CacheNone);
,但可能降低性能 - 每次需要时在背景图层上使用
invalidate(const QRectF & rect = QRectF(), SceneLayers layers = AllLayers)
。
即使第二个实现起来有点棘手,但出于性能和 CPU 懒惰的考虑,我还是推荐它。
一个问题是 MainWindow::drawBackground
中的 std::cout << "draw background\n";
没有刷新 std::cout
。另一方面,由于 std::endl
.
std::cout
在 MainWindow::resizeEvent
中被刷新
使用std::endl
或\n
和std::flush
。
问题是 ui->graphicsView->fitInView(bounds, Qt::KeepAspectRatio);
在小部件实际显示之前不应调用: