Для демонстрации этих подходов мы покажем, как можно добавить возможности технологии «drag-and-drop» в виджет
01 void MyTableWidget::mouseMoveEvent(QMouseEvent *event)
02 {
03 if (event->buttons & Qt::LeftButton) {
04 int distance = (event->pos - startPos).manhattanLength;
05 if(distance >= QApplication::startDragDistance)
06 startDrag;
07 }
08 QTableWidget::mouseMoveEvent(event);
09 }
10 void MyTableWidget::startDrag
11 {
12 QString plainText= selectionAsPlainText;
13 if (plainText.isEmpty)
14 return;
15 QMimeData *mimeData = new QMimeData;
16 mimeData->setText(plainText);
17 mimeData->setHtml(toHtml(plainText));
18 mimeData->setData("text/csv", toCsv(plainText).toUtf8);
19 QDrag *drag = new QDrag(this);
20 drag->setMimeData(mimeData);
21 if (drag->start(Qt::CopyAction | Qt::MoveAction) == Qt::MoveAction)
22 deleteSelection;
23 }
Закрытая функция
01 QString MyTableWidget::toCsv(const QString &plainText)
02 {
03 QString result = plainText;
04 result.replace("\\", "\\\\");
05 result.replace("\"", "\\\"");
06 result.replace("\t", "\", \"")
07 result.replace("\n", "\"\n\"");
08 result.prepend("\"");
09 result.append("\"");
10 return result;
11 }
12 QString MyTableWidget::toHtml(const QString &plainText)
13 {
14 QString result = Qt::escape(plainText);
15 result.replace("\t", "
");
16 result.replace("\n", "\n
");
17 result.prepend("
\n
");
18 result.append("\n");
19 return result;
20 }
Функции
Red Green Blue
Cyan Yellow Magenta
преобразуются в
"Red", "Green", "Blue"
"Cyan", "Yellow", "Magenta"
или в
Red Green Blue
Cyan Yellow Magenta
Преобразование выполняется самым простым из возможных способов с применением функции
01 void MyTableWidget::dropEvent(QDropEvent *event)
02 {
03 if (event->mimeData->hasFormat("text/csv")) {
04 QByteArray csvData = event->mimeData->data("text/csv");
05 QString csvText = QString::fromUtf8(csvData);
06 …
07 event->acceptProposedAction;
08 } else if (event->mimeData->hasFormat("text/plain")) {