Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: IGHOR от Июнь 27, 2008, 15:50



Название: QListWidgetItem в две строки разными шрифтами. Как?
Отправлено: IGHOR от Июнь 27, 2008, 15:50
Привет Всем!
Мне нужно сделать из QListWidgetItem то что на картинке внизу,
на две строки разбиваю \n ом, но в тексте не работают html вставки.
Как можно сделать две строки с разными шрифтами в одном елементе списка QListWidget ?
Буду благодарен за помощь, долго вожусь и ничего не получается


Название: Re: QListWidgetItem в две строки разными шрифтами. Как?
Отправлено: ритт от Июнь 27, 2008, 21:12
написать наследника айтемделегата?


Название: Re: QListWidgetItem в две строки разными шрифтами. Как?
Отправлено: IGHOR от Июнь 27, 2008, 22:03
написать наследника айтемделегата?

Пожалуйста, можно кусок примера ?


Название: Re: QListWidgetItem в две строки разными шрифтами. Как?
Отправлено: ритт от Июнь 28, 2008, 14:26
Цитировать
void QAbstractItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const   [pure virtual]
This pure abstract function must be reimplemented if you want to provide custom rendering. Use the painter and style option to render the item specified by the item index.


Название: Re: QListWidgetItem в две строки разными шрифтами. Как?
Отправлено: IGHOR от Июнь 29, 2008, 14:03
Както не могу разобратся,
QAbstractItemDelegate унаследовать и вместо QListWidgetItem использовать ?


Название: Re: QListWidgetItem в две строки разными шрифтами. Как?
Отправлено: vdann от Февраль 04, 2009, 19:05
...делаешь свой делегат, мой пример:
Код
C++ (Qt)
C++ (QT)
// .h
class SpreadSheetDelegate : public QItemDelegate
{
Q_OBJECT
public:
SpreadSheetDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
 
protected:
QRegExp m_regExpVer;
};
// при необходимости переопределяшь ф-ю paint, что бы по своему отрисовывать ячейки...
// на твоем месте я бы там использовал QLabel, который понимает расширенный текст
 
// .cpp
SpreadSheetDelegate::SpreadSheetDelegate(QObject *parent)
: QItemDelegate(parent)
{
m_regExpVer.setPattern("[0,1]\\.[0-9]{,3}");
}
 
// здесь создешь свой виджет, с помощью которого будешь редактировать выбранный item
QWidget *SpreadSheetDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& style,
  const QModelIndex &index) const
{
int column = index.column();
if(column == 0){
QComboBox *editor = new QComboBox(parent);
editor->setEditable(true);
editor->setFrame(false);
 
editor->addItem("первый");
editor->addItem("второй");
//...
return editor;
}
 
if (column <= 4)
{
QLineEdit *editor = new QLineEdit(parent);
editor->setFrame(false);
 
if (column > 2)
editor->setValidator(new QDoubleValidator(parent));
else
editor->setValidator(new QRegExpValidator(m_regExpVer, parent));
 
return editor;
}
 
 
return QItemDelegate::createEditor(parent, style, index);
}
 
// здесь в соданный виджет-редактор устанавливаешь данные из модели
void SpreadSheetDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QComboBox *dateEditor = qobject_cast<QComboBox *>(editor);
if (dateEditor)
{
dateEditor->setEditText(index.model()->data(index, Qt::EditRole).toString());
}
else
{
QItemDelegate::setEditorData(editor, index);
}
}
 
// а здесь по окончании редактирования введеные данные переставляешь
// из виджета обратно в модель данных
void SpreadSheetDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
  const QModelIndex &index) const
{
QLineEdit *edit = qobject_cast<QLineEdit *>(editor);
if (edit) {
model->setData(index, edit->text());
}
else {
QComboBox *dateEditor = qobject_cast<QComboBox *>(editor);
if (dateEditor) {
model->setData(index, dateEditor->currentText());
}
}
}
 
// в коде
tableWgt->setItemDelegate(new SpreadSheetDelegate());
 

 


Название: Re: QListWidgetItem в две строки разными шрифтами. Как?
Отправлено: IGHOR от Июнь 26, 2009, 03:38
vdann, спасибо! хорошо написано