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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу начать drag в QTableView  (Прочитано 4021 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Март 17, 2015, 13:44 »

привет. нужно перетянуть с таблицы данные на элемент на графической сцене.
элементы уже принимаю перетягивания. не получается запустить dnd с таблицы.
привожу код.
Код:
конструткор диалога
    ui->tableView->viewport()->installEventFilter(this);
    ui->tableView->setDragEnabled(true);
...
bool CTrainListDialog::eventFilter(QObject * o, QEvent *e)
{
    switch (e->type()) {
    case QEvent::MouseButtonPress:
    {
        QMouseEvent * m_event = static_cast<QMouseEvent*>(e);
        if(m_event->button()!=Qt::LeftButton)
            break;

        findex = ui->tableView->indexAt(m_event->pos());
        if(findex.isValid())
            p_startDrag = m_event->pos();
    }
        break;
    case QEvent::MouseMove:
    {
        QMouseEvent * m_event = static_cast<QMouseEvent*>(e);

        if (!(m_event->buttons() & Qt::LeftButton))
                break;
        if ((m_event->pos() - p_startDrag).manhattanLength() < QApplication::startDragDistance())
                break;


        QModelIndex index = ui->tableView->indexAt(p_startDrag);
        if(!index.isValid())
            break;

        CInfoObject    *   infoObject = index.data(Qt::UserRole).value<CInfoObject*>();
        if(!infoObject)
            break;

        int                 id = infoObject->id();
        QItem       *   sender_item = NULL;

        QDrag        *   drag = new QDrag(this);
        QMimeData   *   mimeData = new QMimeData;

        QByteArray      streamData;
        QDataStream     stream(&streamData,QIODevice::WriteOnly);

        stream.writeRawData((const char*)&sender_item,sizeof(QItem*));
        stream.writeRawData((const char*)&id,sizeof(id));

        mimeData->setData("item_data", streamData);
        drag->setMimeData(mimeData);

        Qt::DropAction dropAction = drag->exec(Qt::MoveAction);
        return  false;
    }
        break;
    default:
        break;
    }

    return   QDialog::eventFilter(o,e);
}

Проблема в том что при зажатой мыши перетаскивание не происходит а подсвечивается выделенная строка.
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Март 17, 2015, 15:40 »

Не стал выискивать ошибку. Вот пример который работает:

class sResultModelView : public QTableView, QPoint start_pos.

Код:
void sResultModelView::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
        start_pos = event->pos();

    QTableView::mousePressEvent(event);
}
Код:
void sResultModelView::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) {

        int distance = (event->pos() - start_pos).manhattanLength();

        if (distance >= QApplication::startDragDistance())
            startDrag(Qt::CopyAction | Qt::MoveAction);
    }

    QTableView::mouseMoveEvent(event);
}
Код:
void sResultModelView::startDrag(Qt::DropActions supportedActions)
{
    if (selectionModel()->currentIndex().isValid()) {

        QMimeData *mimeData = new QMimeData;
        QByteArray myArray;
        QDataStream c_stream(&myArray, QIODevice::WriteOnly);
        QString name = "Id row";

        c_stream << name;

        mimeData->setData("application/search_quick_mime", myArray);

        QDrag *drag = new QDrag(this);
        drag->setMimeData(mimeData);

        drag->exec(supportedActions, Qt::CopyAction);
    }
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 17, 2015, 16:07 »

А удалять QDrag необязательно?
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #3 : Март 17, 2015, 16:20 »

Если я правильно понимаю, то нет.

Цитировать
The QMimeData and QDrag objects created by the source widget should not be deleted - they will be destroyed by Qt

ЗЫ. Специально сейчас попробовал. У QMimeData *mimeData = new QMimeData; деструктор отрабатывает, как только отпускаешь клавишу мыши.
« Последнее редактирование: Март 17, 2015, 16:28 от PimenS » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Март 17, 2015, 17:35 »

спасибо, разобрался, банальная ошибка с приведением типа, модель возвращает константный указатель, а я его приводил к обычному, поэтому получал нуль. тему можно закрывать )
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 17, 2015, 18:13 »

Если я правильно понимаю, то нет.

Цитировать
The QMimeData and QDrag objects created by the source widget should not be deleted - they will be destroyed by Qt
Во блин, а я всегда объявляю QDrag на стеке - и никаких крашей. Глянул - можно и так и так, он удаляет через deleteLater
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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