Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Ground от Апрель 21, 2015, 13:21



Название: Многострочный QComboBox
Отправлено: Ground от Апрель 21, 2015, 13:21
Доброго дня! Хочу сделать многострочный QComboBox, причем необходимо, чтобы первая строка была одного шрифта, другая - другого.
Я так понимаю, нужно сделать делегат, и назначить его на свой QComboBox.
Я написал, но судя по отладочным сообщениям, он у меня не работает - вообще не вызывается ни один метод, кроме конструктора. Что я делаю не так?

Код
C++ (Qt)
#include "itemdelegate.h"
#include <QLabel>
#include <QDebug>
 
ItemDelegate::ItemDelegate(QObject *parent) :
   QItemDelegate(parent)
{
}
 
QWidget *ItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   qDebug()<<"createEditor";
 
   QLabel* editor = new QLabel(parent);
   editor->setWordWrap(true);
   editor->setTextFormat(Qt::RichText);
 
   QFont font = editor->font();  // Пытаюсь сделать текст жирным
   font.setBold(true);
   editor->setFont(font);
   return editor;
}
 
void ItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
   QString value = index.model()->data(index, Qt::DisplayRole).toString();
   qDebug()<<"setEditorData:"<<value;
 
   QLabel* label = static_cast<QLabel*>(editor);
   label->setText(QString("<b>%1</b>").arg(value)); // Пытаюсь сделать текст жирным
}
 
void ItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
   qDebug()<<"SetModelData";
 
   QLabel* label = static_cast<QLabel*>(editor);
   QString value = label->text();
   model->setData(index, value, Qt::DisplayRole);
}
 
void ItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   qDebug()<<"updateEditorGeometry";
   editor->setGeometry(option.rect);
}
 
 

Создаю ComboBox и вызываю делегат так:
Код
C++ (Qt)
cbProject = new QComboBox(gbProject);
cbProject->setItemDelegate(new ItemDelegate(cbProject));
cbProject->addItem("<b>Строка 1_1</b>\nСтрока 1_2");
cbProject->addItem("<b>Строка 2_1</b>\nСтрока 2_2");
cbProject->setMinimumHeight(35);


Название: Re: Многострочный QComboBox
Отправлено: gil9red от Апрель 21, 2015, 14:07
Те методы делегата для редактирования ведь создаете, поэтому они и не вызвались


Название: Re: Многострочный QComboBox
Отправлено: Ground от Апрель 21, 2015, 16:16
Те методы делегата для редактирования ведь создаете, поэтому они и не вызвались

Так и какие методы мне переопределять нужно, чтобы все заработало?
Или вообще, может есть способ проще?


Название: Re: Многострочный QComboBox
Отправлено: gil9red от Апрель 21, 2015, 16:27
Те методы делегата для редактирования ведь создаете, поэтому они и не вызвались

Так и какие методы мне переопределять нужно, чтобы все заработало?
Или вообще, может есть способ проще?

Смотрите тут: http://stackoverflow.com/questions/1956542/how-to-make-item-view-render-rich-html-text-in-qt


Название: Re: Многострочный QComboBox
Отправлено: Racheengel от Июнь 11, 2015, 00:29
ммм... как то сильно мудрено сделано, я делал со своей отрисовкой, так проще.
Актуально еще или как?