Qt4: чтение mimeData по умолчанию из QAbstractItemModel - PullRequest
0 голосов
/ 18 августа 2010

То, что я хочу сделать, очень похоже на this .За исключением того, что я работаю с QAbstractItemModel, который имеет древовидную структуру и интересуется не только строкой и столбцом.Фактически, в моей модели столбец всегда равен 0. Но для реализации перетаскивания мне нужно получить родительский, дочерний и непрозрачный указатель, который возвращает internalPointer ().Вот некоторый соответствующий код.CTreeView расширяет QTreeView.

void CTreeView::dragEnterEvent(QDragEnterEvent* event)
{
    if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
    {
        event->acceptProposedAction();
    }
}

void CTreeView::dropEvent(QDropEvent* event)
{
    const QMimeData* mime_data = event->mimeData();
    QByteArray encoded_data =
        mime_data->data("application/x-qabstractitemmodeldatalist");
    QDataStream stream(&encoded_data, QIODevice::ReadOnly);
    while (!stream.atEnd())
    {
        // I can do this.
        int row, column;
        stream >> row >> column;
        // But how do I construct the QModelIndex to get the parent, children,
        // and opaque pointer?

        // I have seen other advice that mentions doing this.
        QMap<int, QVariant> role_data_map;
        stream >> row >> col >> role_data_map;

        // Which allows you to do this.
        QList<int> keys = role_data_map.keys();
        BOOST_FOREACH(int key, keys)
        {
            QVariant variant = role_data_map[key];
            // use the variant
        }
        // But that only gets me part of the way there.
    }
}

Есть идеи?Я хочу поддерживать перетаскивание только в виде дерева, поэтому я думаю о сохранении QModelIndexList selectedIndexes () в переменной-члене моего подкласса и просто манипулирую им напрямую в dropEvent ().Это похоже на обман, так что я все еще интересуюсь способом Qt.Пожалуйста, дайте мне знать, что вы думаете об этой идее.

1 Ответ

0 голосов
/ 19 августа 2010

Во-первых, из вашего кода видно, что вы делаете неправильный путь: вы не должны перегружать dropEvent в своем представлении, а вместо этого dropMimeData в своей модели. Следующий документ объясняет, как сделать dnd с каркасом модель / представление Qt:

http://doc.trolltech.com/latest/model-view-dnd.html

Что касается вашей конкретной проблемы, которая заключается в доступе к internalPointer () отброшенных элементов. Хранение индексов в индексе вашего класса опасно и подвержено ошибкам. То, что вы хотите сделать, это сохранить необходимую информацию в данных MIME. Я не знаю, каков ваш вариант использования, поэтому я не могу угадать, что это за полезные данные - но если вам просто нужно значение internalPointer (и вы можете убедиться, что это значение будет действительным при получении события drop), вы можете просто сохраните его, как вы решите формат. Например, если на ваши данные ссылается уникальный идентификатор где-то (например, идентификатор строки в базе данных), вы можете сохранить эту информацию и использовать в своей модели собственный индексный метод (int rowid), который создает QModelIndex из этой информации. Обычно внутренний указатель индекса устанавливается во время его создания, поэтому это позволит получить всю необходимую информацию.

Если вы сообщите нам, как вы создаете свои индексы, возможно, мы поможем вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...