Russian Qt Forum

Qt => Model-View (MV) => Тема начата: AShaggy от Апрель 22, 2013, 18:49



Название: Drag and Drop для наследников QStandartItem
Отправлено: 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?
Не хочется мне жизнь усложнять, надеюсь есть более простое решение.


Название: Re: Drag and Drop для наследников QStandartItem
Отправлено: AShaggy от Апрель 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 - Код взят отсюда (http://stackoverflow.com/questions/7088278/qstandarditemclone-not-being-called-for-drag-and-drop)

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

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


Название: Re: Drag and Drop для наследников QStandartItem
Отправлено: kambala от Апрель 25, 2013, 17:43
в каком методе ты так пытаешься получить доступ к айтему? qobject_cast пробовал? какой там реально класс возвращается — QStandardItem?


Название: Re: Drag and Drop для наследников QStandartItem
Отправлено: Bepec от Апрель 25, 2013, 17:47
Ыыы.. наскок я помню, там копируется не айтем, а список атрибутов его. И на новом месте создаётся не ваш объект, а создаётся новый standartItem и его полям делается setData  по шаблону.