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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [Решено]QItemDelegate  (Прочитано 8111 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Сентябрь 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 редактор - делегат?
« Последнее редактирование: Сентябрь 19, 2013, 14:22 от demaker » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 10, 2013, 11:06 »

Код
C++ (Qt)
view->setEditTriggers( QAbstractItemView::DoubleClicked );
Записан

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Сентябрь 10, 2013, 11:08 »

а так же нужно указать флагами что элемент редактируемый
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #3 : Сентябрь 10, 2013, 11:10 »

Код
C++ (Qt)
view->setEditTriggers( QAbstractItemView::DoubleClicked );
Непонимающий нет не помогло
« Последнее редактирование: Сентябрь 10, 2013, 11:12 от demaker » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Сентябрь 10, 2013, 11:14 »

ObjectBrowserModel::flags( index_of_clicked_item ) & Qt::ItemIsEditable == true ?
Записан

Qt 5.11/4.8.7 (X11/Win)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #5 : Сентябрь 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;
}
 
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #6 : Сентябрь 10, 2013, 12:02 »

не могли бы привести простой пример, как в делегат вставить иконку  Улыбающийся
Спасибо.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Сентябрь 10, 2013, 12:06 »

не могли бы привести простой пример, как в делегат вставить иконку  Улыбающийся
Делегат не контейнер, чтобы в него что-то вставлять. Он предназначен как минимум для отрисовки иконки.
Что конкретно требуется?
Записан

Qt 5.11/4.8.7 (X11/Win)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #8 : Сентябрь 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)
                            );
}
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Сентябрь 10, 2013, 12:18 »

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

Qt 5.11/4.8.7 (X11/Win)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #10 : Сентябрь 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;
}
 
« Последнее редактирование: Сентябрь 10, 2013, 12:48 от demaker » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Сентябрь 10, 2013, 12:49 »

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

Qt 5.11/4.8.7 (X11/Win)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #12 : Сентябрь 10, 2013, 12:56 »

это как  Непонимающий

Нет,каждая станция это будет подключение с устройством.
И потом щелкнув на станцию должен будет отображаться список подключенных к ней устройств.
« Последнее редактирование: Сентябрь 10, 2013, 12:59 от demaker » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Сентябрь 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 );
}
« Последнее редактирование: Сентябрь 10, 2013, 13:08 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #14 : Сентябрь 10, 2013, 13:11 »

Спасибо все ок Улыбающийся
И вопрос такой, а static зачем?
« Последнее редактирование: Сентябрь 10, 2013, 13:16 от demaker » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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