Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 53

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

01 void ProjectListWidget::dropEvent(QDropEvent *event)

02 {

03 ProjectListWidget *source =

04 qobject_cast<ProjectListWidget *>(event->source());

05 if (source && source != this) {

06 addItem(event->mimeData()->text());

07 event->setDropAction(Qt::MoveAction);

08 event->accept();

09 }

10 }

Π’ DropEvent() ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QMimeData::text() для получСния пСрСнСсСнного тСкста ΠΈ создаСм элСмСнт с этим тСкстом. Нам Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ΅ событиС ΠΊΠ°ΠΊ Β«ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ пСрСтаскивания», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ исходному Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ пСрСнСсСнного элСмСнта.

Β«Drag-and-dropΒ» β€” ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями. Однако Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ прСдусмотрСнныС Π² Qt срСдства ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Β«drag-and-dropΒ». Если Π½Π°ΠΌ трСбуСтся ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ прилоТСния, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mousePressEvent() ΠΈ mouseReleaseEvent().

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² пСрСносимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π”ΠΎ сих ΠΏΠΎΡ€ Π² прСдставлСнных ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΌΡ‹ полагались Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ QMimeData распространСнных Ρ‚ΠΈΠΏΠΎΠ² MIME. Π’Π°ΠΊ, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ QMimeData::setText() для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° пСрСноса тСкста ΠΈ использовали QMimeData:urls() для получСния содСрТимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° пСрСноса Ρ‚ΠΈΠΏΠ° text/uri-list. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст, тСкст Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ HTML, изобраТСния, адрСса URL ΠΈΠ»ΠΈ Ρ†Π²Π΅Ρ‚Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ спокойно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс QMimeData. Но Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°ΠΌΠΈ:

1. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ массива QByteArray, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QMimeData::setData(), ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ·ΠΆΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QMimeData::data().

2. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ подкласс QMimeData ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ formats() ΠΈ retrieveData() для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

3. Для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Β«drag-and-dropΒ» Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ прилоТСния ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ подкласс QMimeData ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π»ΡŽΠ±Ρ‹Ρ… структурах Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… подклассов, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСдостатки: Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·Π±Π²Π°Ρ‚ΡŒ наши структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚ΠΈΠΏ QByteArray, Π΄Π°ΠΆΠ΅ Ссли пСрСносимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ принимаСтся, Π° Ссли трСбуСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ нСсколько MIMEβ€”Ρ‚ΠΈΠΏΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с самыми Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ прилоТСниями, Π½Π°ΠΌ придСтся ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ нСсколько ΠΊΠΎΠΏΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ… (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ MIME). Если Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ большой Ρ€Π°Π·ΠΌΠ΅Ρ€, это ΠΌΠΎΠΆΠ΅Ρ‚ излишнС Π·Π°ΠΌΠ΅Π΄Π»ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния. ΠŸΡ€ΠΈ использовании Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΈΠ»ΠΈ свСсти ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π’ этом случаС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Π΄Π²Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° совмСстно.

Для дСмонстрации этих ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ возмоТности Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Β«drag-and-dropΒ» Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QTableWidget. Π‘ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ пСрСнос ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² MIME: text/plain, text/html ΠΈ text/csv. ΠŸΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ пСрСноса выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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 }

Закрытая функция startDrag() вызываСтся ΠΈΠ· mouseMoveEvent() для инициирования пСрСноса Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ области. ΠœΡ‹ устанавливаСм Ρ‚ΠΈΠΏΡ‹ MIME text/plain ΠΈ text/html, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setText() ΠΈ setHtml(), Π° Ρ‚ΠΈΠΏ text/csv ΠΌΡ‹ устанавливаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ setData(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ MIME ΠΈ массив QByteArray. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ selectionAsString() Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ совпадаСт с ΠΊΠΎΠ΄ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Spreadsheet::copy(), рассмотрСнной Π² Π³Π»Π°Π²Π΅ 4.

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", "<td>");

16 result.replace("\n", "\n<tr><td>");

17 result.prepend("<table>\n<tr><td>");

18 result.append("\n</table>");

19 return result;

20 }

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ toCsv() ΠΈ toHtml() ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ строку со Π·Π½Π°ΠΊΠ°ΠΌΠΈ табуляции ΠΈ ΠΊΠΎΠ½Ρ†Π° строки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ CSV (commaβ€”separated values β€” значСния, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ запятыми) ΠΈ HTML соотвСтствСнно. НапримСр, Π΄Π°Π½Π½Ρ‹Π΅

Red Green Blue

Cyan Yellow Magenta

ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π²

"Red", "Green", "Blue"

"Cyan", "Yellow", "Magenta"

ΠΈΠ»ΠΈ Π²

<table>

<tr><td>Red<td>Green<td>Blue

<tr><td>Cyan<td>Yellow<td>Magenta

</table>

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ выполняСтся самым простым ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… способов с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QString::replace(). Для удалСния ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° HTML ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Qt::escape().

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")) {

09 QString plainText = event->mimeData()->text();

10 …

11 event->acceptProposedAction();

12 }

13 }

Π₯отя ΠΌΡ‹ прСдоставляСм Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ…, ΠΌΡ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π² dropEvent() Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° ΠΈΠ· Π½ΠΈΡ…. Если ΠΏΠΎΠ΄ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСносит ячСйки ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ QTableWidget Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ HTML, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ячСйки Π±Ρ‹Π»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ HTML. Но Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСносит ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ тСкст HTML Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ QTableWidget, ΠΌΡ‹ Π½Π΅ станСм Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π», Π½Π°ΠΌ потрСбуСтся Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ setAcceptDrops(true) ΠΈ setSelectionMode(ContiguousSelection) Π² конструкторС MyTableWidget.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Π΅ΠΌ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎ Π½Π° этот Ρ€Π°Π· ΠΌΡ‹ создадим подкласс QMimeData, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ (ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹Ρ…) ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами QTableWidgetltem ΠΈ массивом QByteArray. НиТС приводится ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ нашСго подкласса:

01 class TableMimeData : public QMimeData

02 {

03 Q_OBJECT

04 public:

05 TableMimeData(const QTableWidget *tableWidget,

06 const QTableWidgetSelectionRange &range);

07 const QTableWidget *tableWidget() const

08 { return myTableWidget; }

09 QTableWidgetSelectionRange range() const { return myRange; }

10 QStringList formats() const;


11 protected:

12 QVariant retrieveData(const QString &format,

13 QVariant::Type preferredType) const;


14 private:

15 static QString toHtml(const QString &plainText);

16 static QString toCsv(const QString &plainText);

17 QString text(int row, int column) const;

18 QString rangeAsPlainText() const;

19 const QTableWidget *myTableWidget;

20 QTableWidgetSelectionRange myRange;

21 QStringList myFormats;

22 };

ВмСсто Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QTableWidgetSelectionRange, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ пСрСносимых ячССк ΠΈ сохраняСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° QTableWidget. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ formats() ΠΈ retrieveData() класса QMimeData ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ.

01 TableMimeData::TableMimeData(const QTableWidget *tableWidget,

02 const QTableWidgetSelectionRange &range)

03 {

04 myTableWidget = tableWidget;

05 myRange = range;

06 myFormats << "text/csv" << "text/html" << "text/plain";

07 }

Π’ конструкторС ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

01 QStringList TableMimeData::formats() const

02 {

03 return myFormats;

04 }

Ѐункция formats() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список MIMEβ€”Ρ‚ΠΈΠΏΠΎΠ², находящихся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ MIMEβ€”Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ нСсущСствСнна, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Β«Π»ΡƒΡ‡ΡˆΠΈΠ΅Β» Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ нСсколько Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², ΠΈΠ½ΠΎΠ³Π΄Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ подходящий.