Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Drag'n'Drop для классов от QAbstractItemView, Drag'n'Drop для классов от QAbstractItem 
:(
    Опции темы
olegkuzn
Дата 8.7.2014, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Здраствуйте.
Не могу понять почему не отрабатывает 'Drag and Drop'.
Модель (BarleyModel) и отображение (BarleyView) порождено от классов QAbstractItemModel и QAbstractItemView соответственно.

Здесь простенькая реализация необходимых методов этих классов.
Код

/*virtual*/
Qt::ItemFlags BarleyModel::flags(const QModelIndex &idx) const
{
    Qt::ItemFlags flag = QAbstractItemModel::flags(idx);
    flag |= (Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);

    return flag;
}

/*virtual*/
QStringList BarleyModel::mimeTipes() const
{
    return QStringList() << "application/barley";
}

/*virtual*/
QMimeData*  BarleyModel::mimeData(const QModelIndexList &indexes) const
{
    Q_UNUSED(indexes);

    QMimeData* mimeData = new QMimeData();
    QByteArray byteArray;
    byteArray.append((qint8)3); // просто записываем цифру 3 в массив байтов
    mimeData->setData("application/barley", byteArray);

    return mimeData;
}

/*virtual*/
Qt::DropActions BarleyModel::supportedDropActions() const
{
      return Qt::CopyAction;
}

/*virtual*/
bool BarleyModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
    Q_UNUSED(row   );
    Q_UNUSED(column);
    Q_UNUSED(parent);

    if(action == Qt::IgnoreAction)
        return false;

    if(data->hasFormat("application/barley"))
    {
        // просто читаем записанную цифру из массива
        data->data("application/barley").at(0);
    }

    return true;
}


и для класса BarleyView

Код


// конструктор
BarleyView::BarleyView(BarleyModel* pModel, QWidget *parent)
          : QAbstractItemView(parent)
{
    setModel(pModel);
    setFrameShape(QFrame::NoFrame);
    setVerticalScrollBarPolicy(  Qt::ScrollBarAlwaysOff);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    viewport()->setFixedSize(viewportSizeHint());
    setFixedSize(viewportSizeHint());

    setDragEnabled(true);
    setAcceptDrops(true);
    setDropIndicatorShown(true);
}

// и перегруженные обработчики событий

void BarleyView::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug("BarleyView::dragEnterEvent");
    event->accept();
}

void BarleyView::dragMoveEvent(QDragMoveEvent *event)
{
    qDebug("BarleyView::dragMoveEvent");
    event->accept();
}



Не отрабатывают даже перегруженные обработчики событий.
P.S. В предыдущей задаче класс модели и отображения был унаследован от 
QAbstractItemModel и QListView и все сработало (с горем пополам).
Наверное просто не хватает какой-то настройки. Только не могу понять какой именно.
PM MAIL   Вверх
olegkuzn
Дата 15.7.2014, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Задачу решил.
Необходимо в классе унаследованом от QAbstractItemView  переопределить методы :   mousePressEvent, mouseMoveEvent, dragEnterEvent, dragMoveEvent, dropEvent

В методе startDrag создать объект QDrag 
и запустить метод объекта QDrag::exec(Qt::DropActions supportedActions) 



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0376 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.