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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Drag and Drop для наследников QStandartItem  (Прочитано 2749 раз)
AShaggy
Гость
« : Апрель 22, 2013, 18:49 »

Доброго времени суток, Форумчане. Помогите пожалуйста новичку в Qt.
Появилась проблема с Drag and Drop в QTreeView.
У меня есть модель QStandardItemModel
В модель добавляются элементы являющиеся наследниками QStandardItem.

примерно такой класс:
Код
C++ (Qt)
class TreeItem : public QObject, public QStandardItem
{
   Q_OBJECT
public:
   explicit TreeItem(QObject* parent = 0);
   enum {Section, Text, Test, Answer, Word};     // перечисленеи типов узлов дерева
   int getType() const;
   bool isAllowedChildren();                       // могут ли быть потомки
   virtual QWidget* getOptionsWidget() const;
   virtual void extendChanhed();
protected:
   int typeOfItem;
   QWidget *optionsWidget;
};
 

так вот когда происходит Drag and Drop, я не могу преобразовать перенесенный элемент к моему классу
Код
C++ (Qt)
TreeItem *forWidget = dynamic_cast<TreeItem*>(model->itemFromIndex(index));
if(forWidget != NULL)
{
       emit signalSendWidget(forWidget->getOptionsWidget());
}
 
Здесь всегда  dynamic_cast возвращает NULL.

Подскажите, как исправить? Придется наследовать QTreeView переопределять Event`Ы Drag and Drop?
Не хочется мне жизнь усложнять, надеюсь есть более простое решение.
Записан
AShaggy
Гость
« Ответ #1 : Апрель 25, 2013, 17:04 »

решил проблему ОЧЕНЬ сложным путем:

итак в нашем классе надо переопределить метод virtual QStandardItem *clone() const
я сделал так
Код
C++ (Qt)
QStandardItem *TreeItem::clone() const
{
   TreeItem *out = new TreeItem(*this);
 
   for(int i = 0; i < this->rowCount(); ++i)
   {
       out->appendRow(this->child(i)->clone());
   }
   return out;
}
 

Теперь нам нужно создать класс специфичной модели QextDragDropModel наследника QStandartItemModel - Код взят отсюда

При копирование у нас соответственно отпадают все подключения сигналов слотов + я думаю, у меня убегает куча памяти (или нет?)

Оно конечно работает, но мне не понятно что именно происходит в коде класса QextDragDropModel, приведенного по ссылке. Может кто разъяснит?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Апрель 25, 2013, 17:43 »

в каком методе ты так пытаешься получить доступ к айтему? qobject_cast пробовал? какой там реально класс возвращается — QStandardItem?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #3 : Апрель 25, 2013, 17:47 »

Ыыы.. наскок я помню, там копируется не айтем, а список атрибутов его. И на новом месте создаётся не ваш объект, а создаётся новый standartItem и его полям делается setData  по шаблону.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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