我尝试使用 QGraphicsView 显示带有一些 QGraphicItem 子类的地图,显示地图的区域中心。从概念上讲,我将地图组织如下:
QGraphicsView
QGraphicsScene
QGraphicsPixmapItem : background image, fixed until next call of loadSetting
QGraphicsRectItem : legend, position relative to bg is fixed throughout app
QGraphicsEllipseItem : region centers
我希望地图的行为如下:
- 没有要显示的滚动条,并且背景图像填充了视图/场景的所有可见区域。
- 当小部件重新调整大小时, QGraphics*Items 将相应地调整自己的大小(就像视图被缩放一样)
QGraphicsEllipseItems 的相对位置,保持固定直到下次调用 loadSetting()
现在我无法正确显示背景图像。
构造函数[我直接将此视图添加到 QTabWidget: myTab->addTab("name", my_view_); ]
MyView::MyView(QWidget *parent) : QGraphicsView(parent) {
bg_pixmap_ = new QGraphicsPixmapItem();
legend_ = new MapLegend();
setScene(new QGraphicsScene(this));
scene()->addItem(bg_pixmap_);
scene()->addItem(legend_);
}
加载地图设置(程序执行过程中,该方法可能会被多次调用)
void MyView::loadSetting(Config* cfg) {
if (!cfg) return;
/* (a) */
scene()->clearFocus();
scene()->clearSelection();
for (int i = 0; i < symbols_.size(); i++)
scene()->removeItem(symbols_[i]);
qDeleteAll(symbols_);
symbols_.clear();
/* (a) */
/* (b) */
background_ = QPixmap(QString::fromStdString(cfg->district_map));
bg_pixmap_->setPixmap(background_);
for (size_t i = 0; i < cfg->centers.size(); i++) {
qreal x = cfg->centers[i].first * background_.width();
qreal y = cfg->centers[i].second * background_.height();
MapSymbol* item = new MapSymbol(x, y, 10);
symbols_.append(item);
scene()->addItem(item);
}
/* (b) */
update();
}
问题
现在除了'bg_pixmap_'之外的所有项目都显示出来了,我检查了'background_'变量,它正确加载了图像。有什么我错过的吗?
如何实现 MyView 的 resizeEvent 以应对所需的“调整大小策略”?