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

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

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

01 void Tetrahedron::draw()

02 {

04 static const GLfloat P1[3]= { 0.0, -1.0, +2.0 };

05 static const GLfloat P2[3] = { +1.73205081, -1.0, -1.0 };

06 static const GLfloat P3[3] = { -1.73205081, -1.0, -1.0 };

07 static const GLfloat P4[3] = { 0.0, +2.0, 0.0 };

08 static const GLfloat * const coords[4][3] = {

09 { P1, P2, Π Π— }, { P1, Π Π—, P4 }, { P1, P4, P2 }, { P2, P4, Π Π— }

10 };


11 glMatrixMode(GL_MODELVIEW);

12 glLoadIdentity();

13 glTranslatef(0.0, 0.0, -10.0);

14 glRotatef(rotationX, 1.0, 0.0, 0.0);

15 glRotatef(rotationY, 0.0, 1.0, 0.0);

16 glRotatef(rotationZ, 0.0, 0.0, 1.0);


17 for (int i = 0; i < 4; ++i) {

18 glLoadName(i);

19 glBegin(GL_TRIANGLES);

20 qglColor(faceColors[i]);

21 for (int j = 0; j < 3; ++j) {

22 glVertex3f(coords[i][j][0],

23 coords[i][j][1], coords[i][j][2]);

24 }

25 glEnd();

26 }

27 }

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ draw() ΠΌΡ‹ рисуСм тСтраэдр, учитывая ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Ρ‹ ΠΏΠΎ осям x, Ρƒ ΠΈ z, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ†Π²Π΅Ρ‚Π° Π² массивС faceColors. Π’Π΅Π·Π΄Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenGL, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° qglColor(). ВмСсто этого ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ OpenGL β€” glColor3d() ΠΈΠ»ΠΈ glIndex() β€” Π² зависимости ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°.

01 void Tetrahedron::mousePressEvent(QMouseEvent *event)

02 {

03 lastPos = event->pos();

04 }


05 void Tetrahedron::mouseMoveEvent(QMouseEvent *event)

06 {

07 GLfloat dx = GLfloat(event->x() - lastPos.x()) / width();

08 GLfloat dy = GLfloat(event->y() - lastPos.y()) / height();

09 if (event->buttons() & Qt::LeftButton) {

10 rotationX += 180 * dy;

11 rotationY += 180 * dx;

12 updateGL();

13 } else if (event->buttons() & Qt::RightButton) {

14 rotationX += 180 * dy;

15 rotationZ += 180 * dx;

16 updateGL();

17 }

18 lastPos = event->pos();

19 }

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса QWidget mousePressEvent() ΠΈ mouseMoveEvent() ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‰Π΅Π»Ρ‡ΠΊΠΎΠΌ ΠΌΡ‹ΡˆΠΊΠΈ ΠΈ Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ. ЛСвая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΊΠΈ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π²ΠΎΠΊΡ€ΡƒΠ³ осСй x ΠΈ Ρƒ, Π° правая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΊΠΈ β€” Π²ΠΎΠΊΡ€ΡƒΠ³ осСй x ΠΈ z.

ПослС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… rotationX ΠΈ rotationY ΠΈΠ»ΠΈ rotationZ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ updateGL() для пСрСрисовки сцСны.

01 void Tetrahedron::mouseDoubleClickEvent(QMouseEvent *event)

02 {

03 int face = faceAtPosition(event->pos());

04 if (face != -1) {

05 QColor color = QColorDialog::getColor(faceColors[face], this);

06 if (color.isValid()) {

07 faceColors[face] = color;

08 updateGL();

09 }

10 }

11 }

Ѐункция mouseDoubleClickEvent() класса QWidget пСрСопрСдСляСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ Π³Ρ€Π°Π½ΠΈ тСтраэдра с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Ρ‰Π΅Π»Ρ‡ΠΊΠ°. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ faceAtPosition() для опрСдСлСния Ρ‚ΠΎΠΉ Π³Ρ€Π°Π½ΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится курсор (Ссли ΠΎΠ½ Π²ΠΎΠΎΠ±Ρ‰Π΅ находится Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π³Ρ€Π°Π½ΠΈ). ΠŸΡ€ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ ΠΏΠΎ Π³Ρ€Π°Π½ΠΈ тСтраэдра ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QColorDialog::getColor() для получСния Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° для этой Π³Ρ€Π°Π½ΠΈ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ обновляСм массив Ρ†Π²Π΅Ρ‚ΠΎΠ² faceColors Π½ΠΎΠ²Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ, ΠΈ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ updateGL() для пСрСрисовки экрана.

01 int Tetrahedron::faceAtPosition(const QPoint &pos)

02 {

03 const int MaxSize = 512;

04 GLuint buffer[MaxSize];

05 GLint viewport[4];


06 glGetIntegerv(GL_VIEWPORT, viewport);

07 glSelectBuffer(MaxSize, buffer);

08 glRenderMode(GL_SELECT);

09 glInitNames();

10 glPushName(0);


11 glMatrixMode(GL_PROJECTION);

12 glPushMatrix();

13 glLoadIdentity();

14 gluPickMatrix(GLdouble(pos.x()),

15 GLdouble(viewport[3] - pos.y()),

16 5.0, 5.0, viewport);

17 GLfloat x = GLfloat(width()) / height();

18 glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);

19 draw();

20 glMatrixMode(GL_PROJECTION);

21 glPopMatrix();


22 if (!glRenderMode(GL_RENDER))

23 return -1;

24 return buffer[3];

25 }

Ѐункция faceAtPosition() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ Π³Ρ€Π°Π½ΠΈ для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈΠ»ΠΈ β€”1, Ссли данная Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π° Π³Ρ€Π°Π½ΡŒ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ срСдств OpenGL, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТСн. ЀактичСски ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Ρ€Π΅ΠΆΠΈΠΌ GL_SELECT, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ возмоТностями OpenGL ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ элСмСнтов изобраТСния, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€ Π³Ρ€Π°Π½ΠΈ (Π΅Π΅ «имя») ΠΈΠ· записи наТатия OpenGL.

НиТС приводится Ρ„Π°ΠΉΠ» main.cpp:

01 #include <QApplication>

02 #include <iostream>

03 #include "tetrahedron.h"

04 using namespace std;


05 int main(int argc, char *argv[])

06 {

07 QApplication app(argc, argv);

08 if (!QGLFormat::hasOpenGL()) {

09 cerr << "This system has no OpenGL support" << endl;

10 return 1;

11 }

12 Tetrahedron tetrahedron;

13 tetrahedron.setWindowTitle(QObject::tr("Tetrahedron"));

14 tetrahedron.resize(300, 300);

15 tetrahedron.show();

16 return app.exec();

17 }

Если систСма ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ OpenGL, ΠΌΡ‹ Π²Ρ‹Π΄Π°Π΅ΠΌ Π½Π° консоль сообщСниС ΠΎΠ± ошибкС ΠΈ сразу ΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.

Для сборки прилоТСния совмСстно с ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ QtOpenGL ΠΈ систСмной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ OpenGL Ρ„Π°ΠΉΠ» .pro Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт:

QT += opengl

Π­Ρ‚ΠΈΠΌ заканчиваСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° прилоТСния ВСтраэдр. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΌΠΎΠ΄ΡƒΠ»Π΅ QtOpenGL Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² справочной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ классам QGLWidget, QGLFormat, QGLContext, QGLColormap ΠΈ QGLPixelBuffer.

Π“Π»Π°Π²Π° 9. ВСхнология Β«drag-and-dropΒ»

ВСхнология Β«drag-and-dropΒ» (Β«ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ ΠΈ ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΒ») являСтся соврСмСнным ΠΈ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ способом ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ прилоТСния ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ прилоТСниями. Она часто являСтся Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ опСрациям с Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΏΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ….

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Qt Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Β«drag-and-dropΒ» ΠΈ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ этой Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π°. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ благодаря Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° основаны Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса QMimeData β€” Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ прСдставлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ….

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Β«drag-and-dropΒ»

ВСхнология Β«drag-and-dropΒ» состоит ΠΈΠ· Π΄Π²ΡƒΡ… дСйствий: пСрСтаскиваниС Β«Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹Ρ…Β» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΈΡ… «освобоТдСниС». Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Π² Qt ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС пСрСносимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π² качСствС мСста отпускания этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ Π² ΠΎΠ±ΠΎΠΈΡ… качСствах.

Π’ нашСм ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Qt ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, пСрСнСсСнный ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ прилоТСния. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Qt прСдставляСт собой Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ QTextEdit Π² качСствС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСносит тСкстовый Ρ„Π°ΠΉΠ» с Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΈΠ»ΠΈ ΠΈΠ· ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΈΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы ΠΈ оставляСт Π΅Π³ΠΎ Π² ΠΎΠΊΠ½Π΅ этого прилоТСния, ΠΎΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ» Π² QTextEdit.

НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСлСния класса MainWindow:

01 class MainWindow : public QMainWindow

02 {

03 Q_OBJECT

04 public:

05 MainWindow();

06 protected:

07 void dragEnterEvent(QDragEnterEvent *event);

08 void dropEvent(QDropEvent *event);

09 private:

10 bool readFile(const QString &fileName);

11 QTextEdit *textEdit;

12 }

Класс MainWindow пСрСопрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dragEnterEvent() ΠΈ dropEvent() класса QWidget. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ†Π΅Π»ΡŒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° являСтся дСмонстрация ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Β«drag-and-dropΒ», большая Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ класса Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° здСсь Π½Π΅ рассматриваСтся.

01 MainWindow::MainWindow()

02 {

03 textEdit = new QTextEdit;

04 setCentralWidget(textEdit);

05 textEdit->setAcceptDrops(false);

06 setAcceptDrops(true);

07 setWindowTitle(tr("Text Editor"));

08 }

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