Размер QGraphicsView в GridLayout - PullRequest
       2

Размер QGraphicsView в GridLayout

0 голосов
/ 23 октября 2011

Я нашел это: Получение размера QGraphicsView

Но я не могу понять, что значит «переместить мой код инициализации в showEvent», и я не могу прокомментировать этот ответ.

Я хочу изменить размер QPixmap, чтобы он мог соответствовать моему QGraphicsView. Я поместил свой графический вид в Designer и установил GridLayout для моего главного окна. В конструкторе MainWindow я написал следующий код: ui-> setupUi (это);

// Get GView size
g_sizeX = ui->mapView->width();
g_sizeY = ui->mapView->height();
// Init  scene
scene = new QGraphicsScene(this);
// Init MAP pixmap and add it to scene
mapImage = new QPixmap(":/Map/europe.jpg");
QPixmap newmapImage = mapImage->scaled(g_sizeX, g_sizeY);
scene->addPixmap(newmapImage);

// Display scene in gview.
ui->mapView->setScene(scene);

Но я всегда получаю размер 100х30. Если я сломаю gridLayout, я получу правильный размер. Итак, как мне быть с этим?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 октября 2011

Размер QGraphicsView будет изменен на QGridLayout после отображения виджета, а также может быть изменен позже, когда само окно будет изменено.

Таким образом, вы должны изменить размер растрового изображения в результате QResizeEvent, либо путем подкласса QGraphicsView переопределить resizeEvent(), а затем преобразовать ваш объект представления в новый класс в конструкторе, чтобы использовать его вместо QGraphicsView или установив объект MainWindow в качестве фильтра событий для представления, которое обрабатывает событие resize из функции MainWindow::eventFilter.

Вы, вероятно, не хотите изменять размер растрового изображения в сцене, а скорее отрегулируйте матрицу вида так, чтобы ваш QGraphicsPixmapItem идеально вписывался в вид, с QGraphicsView::fitInView.

Например:

/* QGraphicsPixmapItem *pixmapItem; as a MainWindow member */
pixmapItem = scene->addPixmap(newmapImage);

/* Either always disable or enable the scrollbars (see fitInView doc) */
ui->mapView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->mapView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

ui->mapView->installEventFilter(this);
...
bool MainWindow::eventFilter(QObject *obj, QEvent *evt) {
     if(obj == ui->mapView && evt->type() == QEvent::Resize) { 
          ui->mapView->fitInView(pixmapItem, Qt::KeepAspectRatioByExpanding);
     }
     // Call the base class implementation 
     return QMainWindow::eventFilter(obj, evt);
}
0 голосов
/ 24 октября 2011

Я считаю, что в настоящее время Qt применяет макеты и устанавливает размеры виджетов только при первом отображении виджета.

Один из способов работы - переопределить QWidget :: showEvent () и поместить ваширазмер кода там.

Однако, один простой способ, которым часто работает в конструкторах, - это запросить виджет для его sizeHint (), а не для его еще не заложенногоout size.

В вашем случае это будет означать изменение двух строк кода на:

g_sizeX = ui->mapView->sizeHint().width();
g_sizeY = ui->mapView->sizeHint().height();

Если ваш макет не слишком сложен, и если вы не переопределили значение по умолчаниюполитика размера, это может исправить все для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...