2

我尝试使用 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 以应对所需的“调整大小策略”?

4

0 回答 0