Russian Qt Forum
Ноябрь 01, 2024, 15:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Многострочный QComboBox  (Прочитано 4800 раз)
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);
« Последнее редактирование: Апрель 21, 2015, 13:23 от Ground » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Апрель 21, 2015, 14:07 »

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

Ground
Гость
« Ответ #2 : Апрель 21, 2015, 16:16 »

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

Так и какие методы мне переопределять нужно, чтобы все заработало?
Или вообще, может есть способ проще?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Апрель 21, 2015, 16:27 »

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

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

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

Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Июнь 11, 2015, 00:29 »

ммм... как то сильно мудрено сделано, я делал со своей отрисовкой, так проще.
Актуально еще или как?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.138 секунд. Запросов: 23.