Название: Не могу начать 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
|