2016-02-05 3 views
2

Я хочу создать такую ​​же структуру QTreeView (не QTreeWidget), как показано на прилагаемом рисунке. Это редактор свойств QT. Я использую QT-4.6Как добавить разные типы делегатов в QTreeView

enter image description here

На 2-е колонка, в зависимости от различных условий, я могу иметь или спиновую коробку или ниспадающий или флажок или редактировать текст ... и так далее. .. Просьба проинструктировать меня о том, как устанавливать разные делегаты в разных ячейках определенного столбца. Из документов видно, что API для установки делегата в ячейке отсутствует (скорее, доступен для полного виджета или строки или столбца).

+0

Если вам нужен буквально редактор свойств, вы можете повторно использовать его у Qt Designer. Есть еще одна открытая библиотека на основе Qt, которая реализует общие листы свойств с пользовательскими редакторами. Я забыл его имя на данный момент. –

ответ

2

Все QAbstractItemDelegate методы, такие как createEditor или paint, имеют индекс модели как один из их параметров. Вы можете получить доступ к данным модели с помощью этого индекса и создать соответствующий виджет делегата. Когда вы создаете свою модель, вы должны установить некоторое значение для каждого элемента, который будет использоваться для различения его типа.

Пример:

enum DelegateType 
{ 
    DT_Text, 
    DT_Checkbox, 
    DT_Combo 
} 

const int MyTypeRole = Qt::UserRole + 1; 

QStandardItemModel* createModel() 
{ 
    QStandardItemModel *model = new QStandardItemModel; 

    QStandardItem *item = new QStandardItem; 
    item->setText("Hello!"); 
    item->setData(DT_Checkbox, MyTypeRole); 

    model->appendRow(item); 

    return model; 
} 

QWidget* MyDelegate::createEditor(QWidget *parent, 
            const QStyleOptionViewItem &option, 
            const QModelIndex &index) const 
{ 
    int type = index.data(MyTypeRole).toInt(); 

    // this is a simplified example 
    switch (type) 
    { 
    case DT_Text: 
     return new QLinedEdit; 
    case DT_Checkbox: 
     return new QCheckBox; 
    case DT_Combo: 
     return new QComboBox; 
    default: 
     return QItemDelegate::createEditor(parent, option, index); 
    } 
} 
+0

спасибо большое hank .... Это сработало ..... –

+0

Еще один вопрос: На разных элементах будет несколько комбинированных ящиков. Теперь я хочу, чтобы разные значения присутствовали в разных списках. Пример: if есть поле со списком для item1, я хочу отображать записи как «a», «b» и «c». Для элемента item4 в поле со списком должны быть указаны как «d», «e», «f» . Каков наилучший способ достичь этого с помощью вышеупомянутого решения, которое вы упомянули? –

+0

В этом случае у вас должно быть два разных типа списков. Например, у вас есть комманда размера шрифта и комбинация цветов шрифта. Каждый из них будет обрабатывать необработанные данные модели по-разному. Предположим, что элемент может иметь исходные значения «1», «2», «3». Тогда первый комбо должен отображать «маленький», «средний», «большой», а второй должен отображать «красный», «синий», «черный». – hank

0

@hank Это в ответ на ваш последний комментарий ... Видите ли вы недостаток в нем?

MyItem* item2 = new MyItem(second); 
    item2->setData(delType, **MyTypeRole**); 
    if(delType == DT_Combo) 
    { 
     QString str1, str2, str3; 
     QStringList abc ; 
     abc << ("1" + str1.setNum(counter)) << ("2" + str2.setNum(counter))<< ("3" + str3.setNum(counter)); 
     item2->setData(abc, MyTypeRole1); 
    } 

QWidget* MyDelegate::createEditor(QWidget *parent, 
            const QStyleOptionViewItem &option, 
            const QModelIndex &index) const 
{ 
    int type = index.data(MyTypeRole).toInt(); 

    // this is a simplified example 
switch (type) 
{ 
case DT_Text: 
    return new QLinedEdit; 
case DT_Combo: 
{ 
QComboBox* cb = new QComboBox(parent); 
QStringList entries - index.data(MyTypeRole1).toStringList(); 
cb->addItems(entries) 
return cb; 
} 


На другом item2 я динамически создавать записи с переменным счетчиком, который отличается каждый раз, когда он приходит сюда ... Здесь, различные комбинированные окна отображения различных записей.
Отличается ли этот подход к вам?

Смежные вопросы