2

I try to use QGraphicsView to display a map with some QGraphicItem-subclass showing region centers of the map. Conceptually, I organize the map as follow:

QGraphicsView
  QGraphicsScene
    QGraphicsPixmapItem  : background image, fixed until next call of loadSetting
    QGraphicsRectItem    : legend, position relative to bg is fixed throughout app
    QGraphicsEllipseItem : region centers

I want the map to behave as follow:

  • no scrollbars to be displayed, and the background image fillup all the visible area of the view/scene.
  • when the widget is re-sized, the QGraphics*Items will re-size themselves accordingly (as if the view is zoomed)
  • relative positions of QGraphicsEllipseItems, remain fixed until next call of loadSetting()

    Now I have problem in getting the background image displayed properly.

Constructor [I'm adding this view to a QTabWidget directly: 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_);
}

Load map setting (during program execution, this method may be invoked multiple times)

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();
}

Questions

  • Now all items except the 'bg_pixmap_' got displayed, and I checked the 'background_' variable that it loads the image correctly. Is there anything I missed?

  • How do I implement the resizeEvent of MyView to cope with the desired 'resize-strategy'?

YamHon.CHAN
  • 866
  • 4
  • 20
  • 36

0 Answers0