2014-03-18 6 views
2

только быстро и легко (возможно) вопроса:QTreeWidget: переименование пункт опустошить

Как предотвратить правку на QTreeWidgetItem от разрешения пустой строки?

В настоящее время я использую QTreeWidgetItem::itemChanged(QTreeWidgetItem*, int), чтобы проверить изменения, и, конечно, я мог бы просто проверить пустую строку, но у меня нет предыдущего текста. Поэтому я остался с настройкой «по умолчанию» QString, но это плохо ...

Thanks & Cheers!

+0

С QTreeView и, например QStandardItemModel (или любая другая модель) это было бы возможно путем переопределения QAbstractItemModel :: setData(). –

+0

Есть ли способ избежать абстрактного вида и просто использовать виджет? – senseiwa

ответ

0

Я бы предложил использовать делегат элемента для виджета дерева для обработки возможного ввода пользователем. Ниже приведено упрощенное решение.

Осуществление пункта делегата:

class Delegate : public QItemDelegate 
{ 
public: 
    void setModelData(QWidget *editor, QAbstractItemModel *model, 
         const QModelIndex &index) const 
    { 
     QLineEdit *lineEdit = qobject_cast<QLineEdit *>(editor); 
     if (!lineEdit->isModified()) { 
      return; 
     } 
     QString text = lineEdit->text(); 
     text = text.trimmed(); 
     if (text.isEmpty()) { 
      // If text is empty, do nothing - preserve the old value. 
      return; 
     } else { 
      QItemDelegate::setModelData(editor, model, index); 
     } 
    } 
}; 

Реализация простого виджета-дерева с редактируемым элементом и пользовательский элементом делегатом:

QTreeWidget tw; 
QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0, 
              QStringList(QString("item 1"))); 
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable); 
tw.addTopLevelItem(item); 
tw.setItemDelegate(new Delegate); 
tw.show(); 
Смежные вопросы