Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QTextBrowser как делегат QListWidget, Отображение html как эелементов 
V
    Опции темы
loneybibi
  Дата 24.4.2011, 03:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

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



Есть QStringList в котором содержатся html теги вроде "<p>item 1</p>"
(вообщем текст с определенным форматированием).
Нужно их отобразить в QListWidget списке как элементы, но обработанные как
в QTextBrowser.
Сразу оговорюсь в делегатах ковыряюсь первый раз. Но все таки решил использовать
для отображения элементов именно их.

Вот создал по инструкции класс делегата на основе QItemDelegate, и второй класс
на основе QListWidget.

Возможно что то другое посоветуете! Заранее благодарю.

И сильно по возможности не ругайте! smile

Ниже проект прикрепил.

Описание класса myDelegate:
Код

class myDelegate:public QItemDelegate{
    Q_OBJECT
public:
    myDelegate(QObject *parent=0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};


Реализация класса myDelegate:
Код

myDelegate::myDelegate(QObject *parent):QItemDelegate(parent)
{

}

QWidget *myDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
    QTextBrowser *editor=new QTextBrowser(parent);
    editor->installEventFilter(const_cast<myDelegate*>(this));
    return editor;
}

void myDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
{
    QString value=index.model()->data(index, Qt::EditRole).toString();
    QTextBrowser *browser=static_cast<QTextBrowser*>(editor);
    browser->insertHtml(value);

}

void myDelegate::setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex& index) const
{
    QTextBrowser *browser=static_cast<QTextBrowser*>(editor);
    QString value=browser->toHtml();
    model->setData(index,value);
}

void myDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex& /* index */) const
{
    editor->setGeometry(option.rect);
}


Описание класса myList:
Код

class myList:public QListWidget{
    Q_OBJECT
public:
    myList(QWidget *parent=0);

};


Реализация класса myList:
Код

myList::myList(QWidget *parent):QListWidget(parent)
{
    myDelegate *delegate=new myDelegate(this);
    setItemDelegateForColumn(0, delegate);
}


Использую так:
Код

    QStringList itemList;
    itemList<<"<p>item1</p>";
    itemList<<"<p>item2</p>";
    myList *mainList=new myList(this);
    setCentralWidget(mainList);
    mainList->addItems(itemList);


Насколько я заметил он создает делегат и добавляет в него текст. Но как мне кажется
QTextBrowser не обрабатывает теги.

Заранее благодарю за ответы.


Это сообщение отредактировал(а) loneybibi - 24.4.2011, 03:57

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  testdelegate.zip 2,41 Kb


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
loneybibi
  Дата 25.4.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

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



Нашел тут статью. Вроде то что надо. на основе QTextEdit и QTextDocument. Отображает html как хотел smile
Кроме двух вещей -  теперь элементы не выделяются ни мышей , ничем что бы можно было удалить! :( И Каждый элемент занимает целую страницу, т.е. 
если элемент содержит одну строку "<p>ITEM</p>" то все окэ элементы как обычно выводятся,  а если пару таких строк то целую страницу. и потом каждый элемент на одну страницу ! Как отрисовать элемент по его размеру и как сделать возможным выделением ? 

Класс:
Код

class myDelegate:public QItemDelegate{
    Q_OBJECT
public:
    myDelegate(QObject *parent=0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QRectF layoutRect(const QTextDocument & td, QRect rect) const;
};


реализация:
Код

myDelegate::myDelegate(QObject *parent):QItemDelegate(parent)
{

}

void myDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                         const QModelIndex &index) const
{
    QString str = index.data(Qt::DisplayRole).toString();
    QTextDocument td;
    td.setHtml(str);

    QStyleOptionViewItem opt = option;
    QRectF lr = layoutRect(td, opt.rect);

    painter->save();
    painter->translate(lr.topLeft());
    painter->setClipRect(lr.translated(-lr.x(), -lr.y()));
    td.drawContents(painter, QRectF());
    painter->restore();
}

QRectF myDelegate::layoutRect(const QTextDocument & td, QRect rect) const
{
    QRectF rectf;
    qreal xo;
    qreal yo;

    Qt::Alignment align;

    if(align & Qt::AlignLeft) {
        xo = 0;
    } else if(align & Qt::AlignRight) {
        qreal rw = td.documentLayout()->documentSize().width();
        xo = 0;
        xo = qMax((rect.width()-rw), qreal(0));
    } else if(align & Qt::AlignHCenter) {
        qreal rw = td.documentLayout()->documentSize().width();
        xo = 0;
        xo = qMax((rect.width()-rw)/2, qreal(0));
    }

    if(align & Qt::AlignTop) {
        yo = 0;
    } else if(align & Qt::AlignBottom) {
        qreal rh = td.documentLayout()->documentSize().height();
        yo = 0;
        yo = qMax((rect.height()-rh), qreal(0));
    } else if(align & Qt::AlignVCenter) {
        qreal rh = td.documentLayout()->documentSize().height();
        yo = 0;
        yo = qMax((rect.height()-rh)/2, qreal(0));
    }
    return QRectF(xo + rect.x(), yo + rect.y(), rect.width(), rect.height());
}

QWidget *myDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
    QTextEdit *textEdit = new QTextEdit(parent);
    return textEdit;
}

void myDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
{
    QString str = index.data(Qt::DisplayRole).toString();
    QTextEdit *textEdit = qobject_cast<QTextEdit*>(editor);
    textEdit->setHtml(str);
}

void myDelegate::setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex& index) const
{
    QTextEdit *textEdit = qobject_cast<QTextEdit*>(editor);
    QString str = textEdit->toHtml();
    model->setData(index, str, Qt::DisplayRole);
}


Это сообщение отредактировал(а) loneybibi - 25.4.2011, 00:51

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  testdelegate.zip 2,76 Kb


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
DarkKnight
Дата 13.8.2013, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чтобы выделялись строки можно сделать так:
Код

    QListWidget* searchListWidget = new QListWidget();

    QLabel* iw = new QLabel("<b>test0</b>test\nstring2<br>324", searchListWidget );
    iw->setWordWrap(true);
    iw->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    iw->setMaximumHeight(999999);

    int width = iw->width();
    int height = iw->heightForWidth(width);

    QListWidgetItem* lwi = new QListWidgetItem(searchListWidget);
    lwi->setSizeHint(QSize(width, height));

    searchListWidget->setItemWidget(lwi, iw);

Работает и в Win7 и в МСВС
Qt 4.6.4.

П.С. Судя по дате поста, тебе это уже врят ли нужно, но мб пригодится кому то еще. 

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

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

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


 




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


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

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