Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ Как добиться подобного внешнего вида?

Автор: Флинт 3.10.2011, 9:55

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

Данные берутся из базы данных, за заголовок, тэги, дату и пр. отвечает своя ячейка в базе данных.
Модель пока сделал, наследуясь от QSqlQueryModel, для представления мне кажется лучше всего подойдет ListView, но как заполнить один его элемент данными из нескольких ячеек таблицы? И как добиться нужного форматирования этих данных? Можно ли сделать это делегатом, или нужно писать свое представление? Направьте в нужную сторону пожалуйста :)

Автор: RazrFalcon 3.10.2011, 10:41

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

Вот пример того, что получилось у меня:
http://kde-apps.org/CONTENT/content-pre2/144956-2.png

Автор: Флинт 3.10.2011, 10:57

Это идея, спасибо.

Автор: Denis.Rassvetniy 3.10.2011, 22:38

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

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

Автор: vankleef 4.10.2011, 18:40

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

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


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

Автор: Флинт 11.11.2011, 9:50

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

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


Размещаю элементы подобным образом в методе 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

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

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

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

Автор: wiz29 11.11.2011, 16:33

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

Автор: Флинт 21.11.2011, 10:47

Цитата(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

Цитата(Флинт @ 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 в http://doc.qt.nokia.com/stable/qpainter.html#drawText-10.

Автор: Флинт 22.11.2011, 14:33

boudingRect() помог все нормально вычислить и отмасштабировать, спасибо. Осталось разобраться как сделать теги (которые подчеркнуты) нажимабельными по типу ссылки.


Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)