Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:
empty-line/>

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 для всего главного окна.

Поделиться:
Популярные книги

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Последнее небо

Игнатова Наталья Владимировна
1. Зверь
Фантастика:
боевая фантастика
6.81
рейтинг книги
Последнее небо

На границе империй. Том 10. Часть 8

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 8

Четники. Королевская армия

Тимофеев Алексей Юрьевич
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Четники. Королевская армия

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Товарищ "Чума" 2

lanpirot
2. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 2

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Я – Стрела. Трилогия

Суббота Светлана
Я - Стрела
Любовные романы:
любовно-фантастические романы
эро литература
6.82
рейтинг книги
Я – Стрела. Трилогия

Неучтенный элемент. Том 1

NikL
1. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 1

Второй кощей

Билик Дмитрий Александрович
8. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Второй кощей

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Инженер Петра Великого 4

Гросов Виктор
4. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого 4