- void
MyTableWidget::mouseMoveEvent(QMouseEvent *event)
- {
if
(event->buttons() & Qt::LeftButton) {
int
distance = (event->pos() - startPos).manhattanLength();
if
(distance >= QApplication::startDragDistance())
- performDrag();
- }
- QTableWidget::mouseMoveEvent(event);
- }
- void
MyTableWidget::performDrag()
- {
- QString plainText = selectionAsPlainText();
if
(plainText.isEmpty())
return
;
- QMimeData *mimeData =
new
QMimeData;
- mimeData->setText(plainText);
- mimeData->setHtml(toHtml(plainText));
- mimeData->setData(
"text/csv"
, toCsv(plainText).toUtf8());
- QDrag *drag =
new
QDrag(
this
);
- drag->setMimeData(mimeData);
if
(drag->exec(Qt::CopyAction | Qt::MoveAction) == Qt::MoveAction)
- deleteSelection();
- }
- QString MyTableWidget::toCsv(
const
QString &plainText)
- {
- QString result = plainText;
- result.replace(
"//", "
////");
- result.replace(
"/""
,
"///""
);
- result.replace(
"/t"
,
"/", /""
);
- result.replace(
"/n"
,
"/"/n/""
);
- result.prepend(
"/""
);
- result.append(
"/""
);
return
result;
- }
- QString MyTableWidget::toHtml(
const
QString &plainText)
- {
- QString result = Qt::escape(plainText);
- result.replace(
"/t"
,
"<td>"
);
- result.replace(
"/n"
,
"/n<tr><td>"
);
- result.prepend(
"<table>/n<tr><td>"
);
- result.append(
"/n</table>"
);
return
result;
- }
Red Green Blue
Cyan Yellow Magenta
"Red", "Green", "Blue"
"Cyan", "Yellow", "Magenta"
- void
MyTableWidget::dropEvent(QDropEvent *event)
- {
if
(event->mimeData()->hasFormat(
"text/csv"
)) {
- QByteArray csvData = event->mimeData()->data(
"text/csv"
);
- QString csvText = QString::fromUtf8(csvData);
// ...
- event->acceptProposedAction();
- }
else
if
(event->mimeData()->hasFormat(
"text/plain"
)) {
- QString plainText = event->mimeData()->text();
// ...
- event->acceptProposedAction();
- }
- }
- class
TableMimeData :
public
QMimeData
- {
- Q_OBJECT
- public
:
- TableMimeData(
const
QTableWidget *tableWidget,
const
QTableWidgetSelectionRange &range);
const
QTableWidget *tableWidget()
const
{
return
myTableWidget; }
- QTableWidgetSelectionRange range()
const
{
return
myRange; }
- QStringList formats()
const
;
- protected
:
- QVariant retrieveData(
const
QString &format,
- QVariant::Type preferredType)
const
;
- private
:
static
QString toHtml(
const
QString &plainText);
static
QString toCsv(
const
QString &plainText);
- QString text(
int
row,
int
column)
const
;
- QString rangeAsPlainText()
const
;
const
QTableWidget *myTableWidget;
- QTableWidgetSelectionRange myRange;
- QStringList myFormats;
- };
- TableMimeData::TableMimeData(
const
QTableWidget *tableWidget,
const
QTableWidgetSelectionRange &range)
- {
- myTableWidget = tableWidget;
- myRange = range;
- myFormats <<
"text/csv"
<<
"text/html"
<<
"text/plain"
;
- }
- QStringList TableMimeData::formats()
const
- {
return
myFormats;
- }
- QVariant TableMimeData::retrieveData(
const
QString &format,
- QVariant::Type preferredType)
const
- {
if
(format ==
"text/plain"
) {
return
rangeAsPlainText();
- }
else
if
(format ==
"text/csv"
) {
return
toCsv(rangeAsPlainText());
- }
else
if
(format ==
"text/html"
) {
return
toHtml(rangeAsPlainText());
- }
else
{
return
QMimeData::retrieveData(format, preferredType);
- }
- }
- void
MyTableWidget::dropEvent(QDropEvent *event)
- {
const
TableMimeData *tableData =
- qobject_cast<
const
TableMimeData *>(event->mimeData());
if
(tableData) {
const
QTableWidget *otherTable = tableData->tableWidget();
- QTableWidgetSelectionRange otherRange = tableData->range();
- // ...
- event->acceptProposedAction();
- }
else
if
(event->mimeData()->hasFormat(
"text/csv"
)) {
- QByteArray csvData = event->mimeData()->data(
"text/csv"
);
- QString csvText = QString::fromUtf8(csvData);
- // ...
- event->acceptProposedAction();
- }
else
if
(event->mimeData()->hasFormat(
"text/plain"
)) {
- QString plainText = event->mimeData()->text();
- // ...
- event->acceptProposedAction();
- }
- QTableWidget::mouseMoveEvent(event);
- }
本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/288742