2016-04-26 2 views
0

Я пишу приложение, которое отображает список файлов в QTableView. Я подклассифицировал QTableView на свой собственный вид (файлBrowserTableView). Цель этой таблицы - отобразить список файлов и папок. Я хотел бы, чтобы пользователь мог выбрать ячейку (или выбор ячеек) и перетащить ее во внешнее приложение, которое принимает MIME этого типа (т. Е. Проводник Windows или Outlook). Из моих исследований кажется, что мне нужно повторно реализовать mousePressEvent и mouseMoveEvent. В рамках этих функций я могу затем создать объект QDrag и установить QMimeData типа QList, который относится к выбранным файлам.Перетаскивание ячейки из QTableView во внешнее приложение

Есть ли у кого-нибудь предложения или примеры кода? Все существующие образцы, которые я нашел, похоже, сосредоточены на удалении строк между виджетами или в тех же виджетах. На данный момент я не заинтересован в каких-либо функциональных возможностях отбрасывания. Другая вещь, которую я хочу сохранить, - это все существующее поведение выбора этого виджета - только когда начинается перетаскивание, я хочу, чтобы это поведение имело место. В настоящий момент мои первоначальные попытки повторно реализовать mousePressEvent означают, что я потерял все поведение выбора в своей таблице. Я установил dragEnabled на свой стол, поэтому я могу перетаскивать ячейки под мышкой, хотя на данный момент я, очевидно, не могу их никуда не отбрасывать.

Заранее спасибо.

ответ

1

Посмотрите на QAbstractItemModel::mimeData. Если вы переопределите это в своей модели, вы можете легко справиться с перетаскиванием. Как только вы начнете перетаскивание, эта функция будет вызываться с выбранными индексами, без необходимости переопределять что-либо из нее в представлении.

Все, что осталось сделать, это использовать QMimeData, чтобы добавить в него файл-лист.

Пример:

QMimeData *MyModel::mimeData(const QModelIndexList &indexes) const { 
    if(indexes.isEmpty()) 
     return Q_NULLPTR; 
    QMimeData *data = new QMimeData(); 
    QList<QUrl> files; 
    foreach(QModelIndex index, indexes) 
     files += QUrl::fromLocalFile(this->getFileName(index)); 
    data->setUrls(files); 
    return data; 
} 
+0

Благодаря для обратной связи. Я закончил реализацию только mouseMoveEvent - моя ошибка, из-за которой я убивал остальную часть поведения выбора, было то, что я не вызывал стандартный QTableView :: mouseMoveEvent (..) после того, как я занимался задачами QMimeData. Моя переписана функция заканчивает тем, как: ' ничтожной fileBrowserTableView :: mouseMoveEvent (QMouseEvent * события) { \t если (кнопки> от событий() и Qt :: LeftButton) { \t \t \t performDrag(); \t} \t QTableView :: mouseMoveEvent (событие); } ' performDrag затем обрабатывает задачи QMimeData, но я предпочитаю ваш метод, поэтому вместо этого реализует это. –

Смежные вопросы