2010-05-17 3 views
0

В моем приложении Qt Я динамически создаю QGraphicsView (s) и добавляю их внутри a QGridLayout. Когда я добавляю первый вид внутри сетки, вид охватывает все доступное пространство внутри сетки. Затем я добавляю второй вид, и теперь есть два одинаковых размера внутри сетки. Затем я добавляю третий вид, и теперь есть три одинаковых размера внутри сетки. И так далее.Получить обновленный размер QGraphicsView

Как я могу получить обновленный размер первого вида?

Ниже приведено мое исследование, но я думаю, что это не работает.

//Definition of viewsPerRow 
static const int viewsPerRow = 3; 
void window::newViewRequested() 
{ 
    QGraphicsView *view = new QGraphicsView; 
    view->setVisible(true); 
    viewVector.push_back(view); 

    for(int i = viewGrid->count(); i < viewVector.count(); i++) 
    { 
     viewGrid->addWidget(view,i/viewsPerRow ,i % viewsPerRow); 
    } 
     qDebug()<<viewGrid->cellRect(0,0); 
    } 
+2

Одна из проблем, с которыми мы столкнулись в прошлом, заключается в том, что их макеты могут задерживать изменение размера любого из виджетов до тех пор, пока они не понадобятся; обычно прямо перед тем, как они рисуют. Поэтому получение размера из виджетов в макете может быть неправильным до тех пор, пока макет не будет выполнен. Я считаю, что есть функция, которая может привести к изменению размера макета, но не помню, что это из рук в руки. –

+0

Что вы пытаетесь сделать с размером? cjhuitt прав, обычно макет не корректирует размер до тех пор, пока он не понадобится. Вероятно, вы делаете то, что вам не нужно, если вам нужно синхронно получать размер после того, как макет исправляет сам. Однако, если вы действительно хотите это сделать, вызовите функцию viewGrid-> activate() после добавления виджета, чтобы заставить его повторить макет. –

+0

Нет серьезной цели, просто пытаясь изучить Qt Framework. Но viewGrid-> activate() не работает. – onurozcelik

ответ

0

Возможно, вы должны использовать методы QWidget::rect(), чтобы получить геометрию самих представлений. Вот пример, который должен работать по назначению.

QVector< QGraphicsView* > views; 
for (int i=0 ; i < 3; ++i) { 
    QGraphicsView *view = new QGraphicsView; 
    view->setVisible(true); 
    viewGrid->addWidget(view, i ,0); 
    views.push_back(view); 
} 

qDebug() << "The view size of the first view is " << views[0]->rect(); 
+0

Я пробовал свой код. Когда я добавил первое представление, я получил размер по умолчанию QGraphicsView, который равен 256 x 192. Когда я добавил второе представление, я получил рассчитанный размер, но на этот раз вычисление было неправильным (я думаю, он считает, что существует только один вид). Когда я добавил третий, я снова получил неправильный расчетный размер (на этот раз я думаю, что он считает, что существует два вида) – onurozcelik

0

Не знаю, почему вам нужен размер первого взгляда, но Qt делает только несколько перерисовки в то время он «думает», что подходит. Поэтому вы не можете полагаться на размер запроса, который вы запрашиваете вне представления.

Я бы попытался использовать resizeEvent, чтобы получать уведомление, когда размер элемента изменяется и выполняет необходимые действия.

Смежные вопросы