我尝试使用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
我希望地图的行为如下:
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以应对所需的“调整大小策略”?