Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Html делегат в QTableView 
:(
    Опции темы
becks
Дата 4.12.2013, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Добрый день!

Задача: Нужно в ячейках таблицы QTableView показывать html текст.

Проблемы:

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

2) Если в html есть ссылки, то при наведении на них и клике по ним нет никакой реакции. Хотелось бы в html вставлять элементы ссылок с надписью "Просмотр" и по клике на эту ссылку выполнялась некоторая Qt функция. Такое возможно?

Вот реализация:

HtmlDelegate.h
Код

#pragma once

#include <QStyledItemDelegate>

class HtmlDelegate : public QStyledItemDelegate
{
public:
    HtmlDelegate(QObject *parent=0) : QStyledItemDelegate(parent)
    {}

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
};


HtmlDelegate.cpp
Код

#include <QPainter>
#include <QTextDocument>

#include "HTMLDelegate.h"

void HtmlDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
    QStyleOptionViewItemV4 options = option;
    initStyleOption(&options, index);

    painter->save();

    QTextDocument doc;
    QFont font = doc.defaultFont();
    font.setPixelSize(12);
    doc.setDefaultFont(font);
    doc.setHtml(options.text);


    options.text = QString();
    options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter);

    painter->translate(options.rect.left(), options.rect.top());
    QRect clip(0, 0, options.rect.width(), options.rect.height());
    doc.drawContents(painter, clip);

    painter->restore();
}

QSize HtmlDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
    QStyleOptionViewItemV4 options = option;
    initStyleOption(&options, index);

    QTextDocument doc;
    doc.setHtml(options.text);
    doc.setTextWidth(options.rect.width());
    return QSize(doc.idealWidth(), doc.size().height());
}


Буду благодарен за любые подсказки. Спасибо.
PM MAIL   Вверх
borisbn
Дата 4.12.2013, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(becks @  4.12.2013,  13:50 Найти цитируемый пост)
Хотелось бы в html вставлять элементы ссылок с надписью "Просмотр" и по клике на эту ссылку выполнялась некоторая Qt функция. Такое возможно?

IMHO тебе нужен не QTextDocument, а QTextBrowser, у которого есть сигнал anchorClicked
А документ у него можно достать методом document()


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
becks
Дата 4.12.2013, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата(borisbn @  4.12.2013,  14:01 Найти цитируемый пост)
IMHO тебе нужен не QTextDocument, а QTextBrowser, у которого есть сигнал anchorClicked



Переделал на QTextBrowser, кое что еще поправил, теперь лучше, но теперь текст не отображается как html, выводит и теги. Что делаю не так?

Код

void HtmlDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
    QStyleOptionViewItemV4 options = option;
    initStyleOption(&options, index);

    painter->save();

    QTextBrowser browser;

    QFont font = browser.document()->defaultFont();
    font.setPixelSize(18);
    browser.document()->setDefaultFont(font);
    browser.setHtml(options.text);

    options.text = index.model()->data(index, Qt::DisplayRole).toString();
    options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter);

    painter->translate(options.rect.left(), options.rect.top());
    QRect clip(0, 0, options.rect.width(), options.rect.height());
    browser.document()->drawContents(painter, clip);
    painter->restore();
}

PM MAIL   Вверх
borisbn
Дата 4.12.2013, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



поставь точку останова на строке
Код
browser.setHtml(options.text);

скопируй содержимое options.text в буфер обмена, положи на форму QTextBrowser и в конструкторе формы вызови browser.setHtml( тот, текст, который скопировал в дебаге)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
becks
Дата 5.12.2013, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата

скопируй содержимое options.text в буфер обмена, положи на форму QTextBrowser и в конструкторе формы вызови browser.setHtml( тот, текст, который скопировал в дебаге) 


Попробовал. Все отображается отлично. Попробовал даже с QTableWidget тоже все прекрасно отображается.

Думаю может быть мне тогда заюзать setIndexWidget( QTextBrowser ), если уж нужен только просмотр и реакция на клик по ссылке, никакого редактирования (т.е. не использовать делегат)?

Это сообщение отредактировал(а) becks - 5.12.2013, 10:40
PM MAIL   Вверх
borisbn
Дата 5.12.2013, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(becks @  5.12.2013,  10:39 Найти цитируемый пост)
Думаю может быть мне тогда заюзать setIndexWidget( QTextBrowser ), если уж нужен только просмотр и реакция на клик по ссылке, никакого редактирования (т.е. не использовать делегат)?

Не знаю как пацаны, а я не возражаю  smile  smile  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
becks
Дата 5.12.2013, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Мужики, ничего не получается с этим делегатом, чего-то затрахался уже.

И отнаследоваться от QItemDelegate пробовал переопределив createEditor, setEditorData, setModelData. Ничего не выходит, ужас какой-то.

Хотелось бы чтоб делегат был основан на QTextBrowser, поскольку anchorClicked отлично отлавливается, спасибо borisbn

Поднимаю еще раз тему, прошу помощи.

PS: Когда в QTableWidget все работает как тебе нужно, становится обидно, что столько времени потратил на MVC, не хотелось бы в итоге остановится на QTableWidget.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0774 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.