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

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

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

01 voidMainWindow::dragEnterEvent(QDragEnterEvent *event)

02 {

03 if (event->mimeData()->hasFormat("text/uri-list"))

04 event->acceptProposedAction();

05 }

Ѐункция dragEnterEvent() вызываСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСносит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚. Если ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ acceptProposedAction() ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ этого события, ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ пСрСносимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π΄Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π½Π΅ смог Π±Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ пСрСносимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Qt автоматичСски измСняСт Ρ„ΠΎΡ€ΠΌΡƒ курсора для увСдомлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎ возмоТности ΠΈΠ»ΠΈ нСвозмоТности ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ. Для этого ΠΌΡ‹ провСряСм MIMEβ€”Ρ‚ΠΈΠΏ пСрСносимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. MIMEβ€”Ρ‚ΠΈΠΏ text/uri-list ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния списка ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² рСсурсов (URI β€” universal resource identifier), Π² качСствС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ², адрСса URL (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, адрСсныС ΠΏΡƒΡ‚ΠΈ HTTP ΠΈ FTP) ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… рСсурсов. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ MIME ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ АгСнтством ΠΏΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΈΠΌΠ΅Π½ ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² сСти Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ (Internet Assigned Numbers Authority β€” IANA). Они состоят ΠΈΠ· Ρ‚ΠΈΠΏΠ° ΠΈ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠ°, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… слСшСм. Π’ΠΈΠΏΡ‹ MIME ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Β«drag-and-dropΒ» для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ список MIMEβ€”Ρ‚ΠΈΠΏΠΎΠ² доступСн ΠΏΠΎ адрСсу http://www.iana.org/assignments/media-types/.

01 void MainWindow::dropEvent(QDropEvent *event)

02 {

03 QList<QUrl> urls = event->mimeData()->urls();

04 if (urls.isEmpty())

05 return;

06 QString fileName = urls.first().toLocalFile();

07 if (fileName.isEmpty())

08 return;

09 if (readFile(fileName))

10 setWindowTitle(tr("%1 -%2").arg(fileName)

11 .arg(tr("Drag File")));

12 }

Ѐункция dropEvent() вызываСтся, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ отпускаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QMimeData::urls() для получСния списка адрСсов QUrl. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ пСрСносят ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ», Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚Π°ΠΊΠΆΠ΅ пСрСнос сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Если имССтся нСсколько URL ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ URL оказываСтся Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ, ΠΌΡ‹ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.

QWidget содСрТит Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dragMoveEvent() ΠΈ dragLeaveEvent(), Π½ΠΎ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ потрСбуСтся ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пСрСтаскиваниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΅Π³ΠΎ послС отпускания. ΠœΡ‹ создадим подкласс QListWidget, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Β«drag-and-dropΒ» ΠΈ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Project Chooser (ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²), ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π½Π° рис. 9.1.

Рис. 9.1. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Project Chooser.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Project Chooser прСдоставляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π΄Π²Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° со списками ΠΈΠΌΠ΅Π½ людСй. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ список прСдставляСт ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Β«drag-and-dropΒ» пСрСвСсти Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Β«drag-and-dropΒ» находится Π² подклассС QListWidget. НиТС приводится ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса:

01 class ProjectListWidget : public QListWidget

02 {

03 Q_OBJECT

04 public:

05 ProjectListWidget(QWidget *parent= 0);

06 protected:

07 void mousePressEvent(QMouseEvent *event);

08 void mouseMoveEvent(QMouseEvent *event);

09 void dragEnterEvent(QDragEnterEvent *event);

10 void dragMoveEvent(QDragMoveEvent *event);

11 void dropEvent(QDropEvent *event);

12 private:

13 void startDrag();

14 QPoint startPos;

15 };

ProjectListWidget пСрСопрСдСляСт ΠΏΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² QWidget.

01 ProjectListWidget::ProjectListWidget(QWidget *parent)

02 : QListWidget(parent)

03 {

04 setAcceptDrops(true);

05 }

Π’ конструкторС ΠΌΡ‹ обСспСчиваСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ΅ΠΌΠ° пСрСносимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ со списком.

01 void ProjectListWidget::mousePressEvent(QMouseEvent *event)

02 {

03 if (event->button() == Qt::LeftButton)

04 startPos = event->pos();

05 QListWidget::mousePressEvent(event);

06 }

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π»Π΅Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΊΠΈ, ΠΌΡ‹ сохраняСм ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΌΡ‹ΡˆΠΊΠΈ Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ startPos. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π² классС QListWidget Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ mousePressEvent() для обСспСчСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² QListWidget ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ события наТатия ΠΊΠ½ΠΎΠΏΠΊΠΉ ΠΌΡ‹ΡˆΠΊΠΈ.

01 void ProjectListWidget::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 QListWidget::mouseMoveEvent(event);

09 }

ДСйствиС, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ курсор ΠΌΡ‹ΡˆΠΊΠΈ ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π΅Ρ€ΠΆΠΈΡ‚ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ Π»Π΅Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ, ΠΌΡ‹ рассматриваСм ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΠΎ пСрСтаскивания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠœΡ‹ вычисляСм расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ ΠΌΡ‹ΡˆΠΊΠΈ ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ наТатия Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΊΠΈ. Если это расстояниС ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π² QApplication расстояниС для рСгистрации Π½Π°Ρ‡Π°Π»Π° пСрСтаскивания (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 4 пиксСля), ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ startDrag() для запуска процСсса пСрСтаскивания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ процСсса пСрСтаскивания ΠΈΠ·-Π·Π° дроТания Ρ€ΡƒΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

01 void ProjectListWidget::startDrag()

02 {

03 QListWidgetItem *item = currentItem();

04 if (item) {

05 QMimeData *mimeData = new QMimeData;

06 mimeData->setText(item->text());

07 QDrag *drag = new QDrag(this);

08 drag->setMimeData(mimeData);

09 drag->setPixmap(QPixmap(":/images/Ρ€Π΅rson.png"));

10 if (drag->start(Qt::MoveAction) == Qt::MoveAction)

11 delete item;

12 }

13 }

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ startDrag() ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° QDrag с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ this Π² качСствС Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ элСмСнта. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ QDrag Ρ…Ρ€Π°Π½ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ QMimeData. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ обСспСчиваСм Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° text/plain, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QMimeData::setText(). Класс QMimeData содСрТит нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных Ρ‚ΠΈΠΏΡ€Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² пСрСноса (ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, адрСсов URL, Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΈ Ρ‚.Π΄.); ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ MIME, прСдставлСнныС массивами QByteArray. Π’Ρ‹Π·ΠΎΠ² QDrag::setPixmap() Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая слСдуСт Π·Π° курсором Π² процСссС пСрСтаскивания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QDrag::start() запускаСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ пСрСтаскивания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΆΠ΄Π΅Ρ‚, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ отпустит пСрСтаскиваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ пСрСтаскиваниС. Π’ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ задаСтся ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Β«ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ пСрСтаскивания» (Qt::CopyAction, Qt::MoveAction ΠΈ Qt::LinkAction); ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ пСрСтаскивания, которая Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° (ΠΈΠ»ΠΈ Qt::IgnoreAction, Ссли Π½Π΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ). Π’ΠΈΠΏ выполняСмой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ исходным Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡˆΠΈβ€”ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π½Π°ΠΆΠ°Ρ‚Ρ‹ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ отпуска пСрСносимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ПослС Π²Ρ‹Π·ΠΎΠ²Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Qt становится Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ пСрСносимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ Π΅Π³ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ станСт Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΌ.

01 void ProjectListWidget::dragEnterEvent(QDragEnterEvent *event)

02 {

03 ProjectListWidget *source =

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

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

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

07 event->accept();

08 }

09 }

Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ ProjectListWidget Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ пСрСнос ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ являСтся мСстом ΠΏΡ€ΠΈΠ΅ΠΌΠ° Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ссли ΠΎΠ½ΠΈ приходят ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ProjectListWidget Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ самого прилоТСния. QDragEnterEvent::source() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ пСрСнос, Ссли этот Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ самому ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ qobject_cast<T>(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ пСрСноса Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ ProjectListWidget. Если всС Π²Π΅Ρ€Π½ΠΎ, ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Qt Π½Π° Π½Π°ΡˆΡƒ Π³ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ восприятия Π΄Π°Π½Π½ΠΎΠ³ΠΎ дСйствия ΠΊΠ°ΠΊ пСрСноса.

01 void ProjectListWidget::dragMoveEvent(QDragMoveEvent *event)

02 {

03 ProjectListWidget *source =

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

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

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

08 event->accept();

09 }

10 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dragMoveEvent() ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dragEnterEvent(). Он Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ приходится ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² классС QListWidget (Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² классС QAbstractItemView).

01 void ProjectListWidget::dropEvent(QDropEvent *event)

02 {

03 ProjectListWidget *source =