crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Как добиться подобного внешнего вида?
Флинт
  опции профиля:
сообщение 3.10.2011, 9:55
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 1.10.2011
Пользователь №: 2919

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




Репутация:   0  


Вот собственно скриншот макета:

Данные берутся из базы данных, за заголовок, тэги, дату и пр. отвечает своя ячейка в базе данных.
Модель пока сделал, наследуясь от QSqlQueryModel, для представления мне кажется лучше всего подойдет ListView, но как заполнить один его элемент данными из нескольких ячеек таблицы? И как добиться нужного форматирования этих данных? Можно ли сделать это делегатом, или нужно писать свое представление? Направьте в нужную сторону пожалуйста :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 10:41
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Я бы создал класс QWidget. В нем бы расположил все что нужно для одной ячейки. Потом бы брал данные из БД и задавал значение элементов QWidget. А потом добавлял бы готовый QWidget в ячейку QListWidget.

Вот пример того, что получилось у меня:
http://kde-apps.org/CONTENT/content-pre2/144956-2.png
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Флинт
  опции профиля:
сообщение 3.10.2011, 10:57
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 1.10.2011
Пользователь №: 2919

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




Репутация:   0  


Это идея, спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Denis.Rassvetniy
  опции профиля:
сообщение 3.10.2011, 22:38
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 22.9.2011
Пользователь №: 2899

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




Репутация:   0  


Цитата(Флинт @ 3.10.2011, 10:55) *
Модель пока сделал, наследуясь от QSqlQueryModel, для представления мне кажется лучше всего подойдет ListView, но как заполнить один его элемент данными из нескольких ячеек таблицы? И как добиться нужного форматирования этих данных?

Напишите свой делегат (наследуйте от QStyledItemDelegate), переопределите в нём функцию paint().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vankleef
  опции профиля:
сообщение 4.10.2011, 18:40
Сообщение #5


Студент
*

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

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




Репутация:   1  


Цитата(Denis.Rassvetniy @ 3.10.2011, 23:38) *
Цитата(Флинт @ 3.10.2011, 10:55) *
Модель пока сделал, наследуясь от QSqlQueryModel, для представления мне кажется лучше всего подойдет ListView, но как заполнить один его элемент данными из нескольких ячеек таблицы? И как добиться нужного форматирования этих данных?

Напишите свой делегат (наследуйте от QStyledItemDelegate), переопределите в нём функцию paint().


да, на мой взгляд создание своего делегата тут как раз уместно, т.к. используешь базы данных
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Флинт
  опции профиля:
сообщение 11.11.2011, 9:50
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 1.10.2011
Пользователь №: 2919

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




Репутация:   0  


Возник следующий вопрос. Делегат %

Возник следующий вопрос. Делегат свой я сделал и даже добился нужного внешнего вида, проблемы начинаются, когда в средней строчке, где планируется размещать комментарии появляется слишком много текста, а соседние строки текста ничего не знают о размере друг друга и ничего не масштабируется, примерно так:


Размещаю элементы подобным образом в методе paint делегата:
painter->setFont(QFont("Arial", 10));
         painter->drawText(QRect(rect.left()+25, rect.top()+rect.height()/4, rect.width(), rect.height()/2),
                              Qt::TextWordWrap, comment);
         painter->setFont(QFont("Arial", 12));
         painter->setPen(Qt::gray);
         painter->drawText(QRect(rect.left()+25, rect.top()+rect.height()/2, rect.width(), rect.height()/2),
                              opt.displayAlignment, "Метки: "+ tag);
         painter->setPen(QColor(80,0,180));
          painter->drawText(QRect(rect.left()+rect.width()/2, rect.top()+rect.height()/2, rect.width(), rect.height()/2),
                              opt.displayAlignment, date.toString("dd.MM.yyyy"));


Метод sizeHint пока такой:
QSize SfDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QSize result = QStyledItemDelegate::sizeHint(option, index);
    result.setHeight(result.height()*5);
    return result;
}


Куда копать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.11.2011, 11:08
Сообщение #7


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


нужно как-то передавать каждому элементу его разрешённую прямоугольную область, чтобы он за неё не выходил

посмотри, есть ли у метода drawText флага, который делает клиппинг по прямоугольнику

а чтобы ничего не обрезалось, эти прямоугольники надо так подгонять

Сообщение отредактировал Алексей1153 - 11.11.2011, 11:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 11.11.2011, 16:33
Сообщение #8


Старейший участник
****

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

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




Репутация:   12  


попробуй использовать QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 ) const
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Флинт
  опции профиля:
сообщение 21.11.2011, 10:47
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 1.10.2011
Пользователь №: 2919

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




Репутация:   0  


Цитата(wiz29 @ 11.11.2011, 17:33) *
попробуй использовать QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 ) const


Добавляет три точки, где текст обрывается, не знаю чем это может помочь 8)

Пробывал через QFontMetrics узнавать высоту каждой строчки, но не понял как вычислить высоту абзаца.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 21.11.2011, 14:34
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

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




Репутация:   11  


Цитата(Флинт @ 21.11.2011, 11:47) *
Цитата(wiz29 @ 11.11.2011, 17:33) *
попробуй использовать QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 ) const


Добавляет три точки, где текст обрывается, не знаю чем это может помочь 8)

Пробывал через QFontMetrics узнавать высоту каждой строчки, но не понял как вычислить высоту абзаца.

Надо установить свойство uniformRowHeights в false. Перекрыть SizeHint.
Для получения размера текста можешь использовать параметр boundingRect в QPainter::drawText.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 5:20