Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Сентябрь 10, 2013, 11:01



Название: [Решено]QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 11:01
Код
C++ (Qt)
 
//----------------------------------Delegate.cpp-------------------------------------------------------------------------
 
QWidget *Delegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   QLineEdit *lineEdit = new QLineEdit(parent);
   return lineEdit;
}
 
void Delegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
   QString string = index.model()->data(index,Qt::EditRole).toString();
   QLineEdit *le = static_cast<QLineEdit* >(editor);
   le->setText(string);
}
 
//-------------------mainwindow.cpp--------------------------
 
Delegate *mydelegate = new Delegate(this);
 
QTreeView*view = new QTreeView;
view->resize(400,600);
view->show();
 
ObjectBrowserModel*model = new ObjectBrowserModel(base);
view->setModel(model);
view->setItemDelegate(mydelegate);
 
 

Не понимаю почему при двойном щелчке мыши
на элемент дерева, не отображается  QLineEdit редактор - делегат?


Название: Re: QItemDelegate
Отправлено: GreatSnake от Сентябрь 10, 2013, 11:06
Код
C++ (Qt)
view->setEditTriggers( QAbstractItemView::DoubleClicked );


Название: Re: QItemDelegate
Отправлено: Fregloin от Сентябрь 10, 2013, 11:08
а так же нужно указать флагами что элемент редактируемый


Название: Re: QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 11:10
Код
C++ (Qt)
view->setEditTriggers( QAbstractItemView::DoubleClicked );
??? нет не помогло


Название: Re: QItemDelegate
Отправлено: GreatSnake от Сентябрь 10, 2013, 11:14
ObjectBrowserModel::flags( index_of_clicked_item ) & Qt::ItemIsEditable == true ?


Название: Re: QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 11:23
ObjectBrowserModel::flags( index_of_clicked_item ) & Qt::ItemIsEditable == true ?

Да спасибо, вот этого и не хватало

Код
C++ (Qt)
Qt::ItemFlags ObjectBrowserModel::flags(const QModelIndex &index) const
{
   if(index.isValid())
   {
       return Qt::ItemIsEditable|Qt::ItemIsSelectable|Qt::ItemIsEnabled;
   }
   else
       return 0;
}
 


Название: Re: QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 12:02
не могли бы привести простой пример, как в делегат вставить иконку  :)
Спасибо.


Название: Re: QItemDelegate
Отправлено: GreatSnake от Сентябрь 10, 2013, 12:06
не могли бы привести простой пример, как в делегат вставить иконку  :)
Делегат не контейнер, чтобы в него что-то вставлять. Он предназначен как минимум для отрисовки иконки.
Что конкретно требуется?


Название: Re: QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 12:12
Делегат не контейнер, чтобы в него что-то вставлять. Он предназначен как минимум для отрисовки иконки.
Что конкретно требуется?

Есть иконки, хочу чтобы она была перед надписью в древовидной модели.

Пытался сделать так, но не получается
Код
C++ (Qt)
 
void Delegate::drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect, const QPixmap &pixmap) const
{
   QIcon icon;
   icon.setThemeName("D:\images\networkee.png");
 
   QItemDelegate::drawDecoration(painter,
                            option,
                            option.rect,
                            icon.pixmap(QSize(22,22),QIcon::Normal,QIcon::On)
                            );
}
 


Название: Re: QItemDelegate
Отправлено: GreatSnake от Сентябрь 10, 2013, 12:18
Да уж оптимально, ничего не скажешь... Кто же при каждой отрисовке грузит иконку да ещё делает из неё пиксмап???
И чем не устроила стандартная отрисовка, которая будет отрабатывать при установке иконки через
Код
C++ (Qt)
model->setData( index, icon, Qt::DecorationRole );


Название: Re: QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 12:43
Да уж оптимально, ничего не скажешь... Кто же при каждой отрисовке грузит иконку да ещё делает из неё пиксмап???
И чем не устроила стандартная отрисовка, которая будет отрабатывать при установке иконки через
Код
C++ (Qt)
model->setData( index, icon, Qt::DecorationRole );

Сделал так,
Что то не катит
Код
C++ (Qt)
bool ObjectBrowserModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
   QObject *obj;
   if(index.isValid())
   {
       obj = reinterpret_cast<QObject* >(index.internalPointer());
   }
   else
   {
       obj = base;
   }
 
   if(role == Qt::EditRole)
   {
       if(index.column() == 0 && QVariant(obj->metaObject()->className()).toString() == "Station")
       {
           Station*s =  dynamic_cast<Station*>(obj);
           s->str = value.toString();  
 
       }
       else  if(index.column() == 1 && QVariant(obj->metaObject()->className()).toString() == "Device")
       {
           Device*d =  dynamic_cast<Device*>(obj);
           d->str = value.toString();
       }
       return true;
   }
   else if(role == Qt::DecorationRole)
   {
 
       if(index.column() == 0 && QVariant(obj->metaObject()->className()).toString() == "Station")
       {
           QAbstractItemModel::setData(index,QIcon("D:/images/networkee.png"),Qt::DecorationRole);            
       }
       return true;
   }
   return false;
}
 


Название: Re: QItemDelegate
Отправлено: GreatSnake от Сентябрь 10, 2013, 12:49
Чего-то перемудрёно.
Зачем это делать в ObjectBrowserModel::setData(), если это можно сразу возвращать в ObjectBrowserModel::data()  ???
И напрашивается вопрос, а стоило ли затевать свой MVC для таблицы из 2-х колонок? Или это процесс освоения Qt?


Название: Re: QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 12:56
это как  ???

Нет,каждая станция это будет подключение с устройством.
И потом щелкнув на станцию должен будет отображаться список подключенных к ней устройств.


Название: Re: QItemDelegate
Отправлено: GreatSnake от Сентябрь 10, 2013, 13:04
Да вот так
Код
C++ (Qt)
QVariant ObjectBrowserModel::data( const QModelIndex& index, int role ) const
{
if( role == Qt::DecorationRole &&
index.column() == 0 && obj->metaObject()->className() == "Station" )
{
static QIcon icon( ":/images/networkee.png" ); // icon better place in the resources
return QVariant::fromValue< QIcon >( icon );
}
return QAbstractItemModel::data( index, role );
}


Название: Re: QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 13:11
Спасибо все ок :)
И вопрос такой, а static зачем?


Название: Re: QItemDelegate
Отправлено: GreatSnake от Сентябрь 10, 2013, 13:13
Нет, не помогло ???
Не верю. Кто в итоге сейчас рисует иконку? Какой делегат?


Название: Re: QItemDelegate
Отправлено: GreatSnake от Сентябрь 10, 2013, 13:18
И вопрос такой, а static зачем?
А зачем нам постоянно грузить одно и тоже?
Разве это не статические данные?


Название: Re: QItemDelegate
Отправлено: demaker от Сентябрь 10, 2013, 13:20
Согласен.
Большое спасибо, Вам, за помощь :)