crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Немного логики про размещение item'ов в GraphicsModel..
Andrewshkovskii
  опции профиля:
сообщение 1.12.2009, 14:15
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Допустим, есть графический модель, её максимальный размер всегда известен (maxSize).
Есть графические айтемы в виде текста, из количество всегда разное (от 2 до 19) , высота шрифта текста известна ( fn.height() ), расположены они вертикально, текст ориентирован горизонтально, все айтемы отображаются от левой границы модели ,сверху вниз т.е построчно.
Теперь вопрос :
Как найти максимальный вертикальный отступ (строки от другой строки, не заходя за границы модели ) айтемов друг от друга, что бы заполнить все не используемое вертикальное пространство модели, если учесть, что количество айтемов всегда будет изменяться ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 1.12.2009, 14:21
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Если я правильно понял задачу....
itemsSpace.height // = Вычислить высоту всех итемов на сцене.
freeSpace.height = maxSize.height - itemsSpace.height; // Свободное место
separator.height = freeSpace.height / (numItem - 1); // Размер пространства между итемами

Сообщение отредактировал BRE - 1.12.2009, 14:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 1.12.2009, 15:05
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Хм..не вышло, при увеличении количества айтемов они все больше и больше начинают сжиматься, пока вконец друг на друга не налезут..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 1.12.2009, 15:36
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Andrewshkovskii @ 1.12.2009, 15:05) *
Хм..не вышло, при увеличении количества айтемов они все больше и больше начинают сжиматься, пока вконец друг на друга не налезут..

Подожди, размер итема фиксирован и сумма размеров итемов всегда меньше maxSize? Или нет?
Здесь мы пытаемся рассчитать размер свободного места между итемами, что-бы они заняли все пространство.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 1.12.2009, 15:49
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Поправьте, пожалуйста, название темы. "Немного логики...." вместо "Немого логики...."! Извините, что не в тему пост!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 1.12.2009, 15:53
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Высота фиксирована размерами шрифта, а длина варьируется(но эт не важно).
сумма размеров айтема >=MaxSize. Сейчас покажу скрин..

А логика рисования такая :
void Model::calculateNewVisualResult(QStandardItemModel *model)//модель, откуда берутся названия айтемов
{
  //  QVector < QPair < QPointF, QGraphicsTextItem *> >  graphicsItems;

    graphicsItems.clear();
    visualResultModel->clear();
    static QFont font("Times",9);//шрифт..
    static QFontMetrics fn (font);
    QGraphicsLineItem *line;
    static qreal x = -1;//координаты лев.верхнего угла
    qreal y= -5;//координаты лев.вер...
    static qreal yGrow = fn.height()-1.2;//расстояние между айтемами..
    static int maxSize =0;
    graphicsItems.push_back(qMakePair(QPointF(fn.width(model->horizontalHeaderItem(0)->text()),fn.height()/2)
                                      ,visualResultModel->addText(model->horizontalHeaderItem(0)->text(),font)));//тут рисуем нулевой айтем
    graphicsItems[0].second->setPos(x,y);//ставим его вверх. левый угол
    maxSize = fn.width(graphicsItems.at(0).second->toPlainText());//вычисляем макс. размер для граничной линии
    for(int i=1;i<model->rowCount();++i)
    {
        graphicsItems.push_back(qMakePair(QPointF(0,0),
                                visualResultModel->addText(model->horizontalHeaderItem(i)->text(),font)));
        graphicsItems[i].second->setPos(x,y+yGrow);// позицианируем айтем..
        y=graphicsItems.at(i).second->pos().y();
        graphicsItems[i].first.setX(fn.width(graphicsItems[i].second->toPlainText()));//
        graphicsItems[i].first.setY(y+(yGrow-1.6));
        if (maxSize < fn.width(graphicsItems.at(i).second->toPlainText()))
             maxSize = fn.width(graphicsItems.at(i).second->toPlainText());
    }
//..
}

Скриншотики

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 1.12.2009, 16:06
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Ну пробуй, мы рассчитали размер незаполненного пространства, разделили его на количество элементов - получили размер пространства между элементами (spaceHeight).
Item.y + Item.height + spaceHeight = координата следующего элемент
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 16:47