Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Fregloin от Март 17, 2015, 13:44



Название: Не могу начать drag в QTableView
Отправлено: Fregloin от Март 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);
}

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


Название: Re: Не могу начать drag в QTableView
Отправлено: PimenS от Март 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);
    }
}


Название: Re: Не могу начать drag в QTableView
Отправлено: Igors от Март 17, 2015, 16:07
А удалять QDrag необязательно?


Название: Re: Не могу начать drag в QTableView
Отправлено: PimenS от Март 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; деструктор отрабатывает, как только отпускаешь клавишу мыши.


Название: Re: Не могу начать drag в QTableView
Отправлено: Fregloin от Март 17, 2015, 17:35
спасибо, разобрался, банальная ошибка с приведением типа, модель возвращает константный указатель, а я его приводил к обычному, поэтому получал нуль. тему можно закрывать )


Название: Re: Не могу начать drag в QTableView
Отправлено: Igors от Март 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