Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Реальный пример


Ниже приведен простой пример виджета с комментариями.

  1. #ifndef LCDNUMBER_H
  2. #define LCDNUMBER_H
  3. #include <QFrame>
  4. class LcdNumber: public QFrame
  5. {
  6. Q_OBJECT

* This source code was highlighted with Source Code Highlighter.


Класс LcdNumber наследует QObject, который обладает большинством информации о сигналах и слотах через классы QFrame и QWidget. Он похож на встроенный виджет QLCDNumber.
Макрос Q_OBJECT указывает препроцессору объявить несколько функций-членов, которые будут реализованы программой moc; если при компилировании среди прочих будет появляется запись «undefined reference to vtable for LcdNumber», то скорее всего забыли запустить moc или добавить результат его работы в команду линковки.

  1. public:
  2. LcdNumber(QWidget *parent = 0);

* This source code was highlighted with Source Code Highlighter.


Это не явно относится к moc'у, но если мы наследуем класс Qwidget, мы скорее всего захотим иметь аргумент parent (родитель) в конструкторе и передавать его конструктору родительского класса.
Некоторые деструкторы и функции-члены опущены здесь; moc игнорирует функции-члены.

  1. signals:
  2. void overflow();

* This source code was highlighted with Source Code Highlighter.


LcdNumber вырабатывает сигнал когда его просят показать невозможное значение.
Если мы не заботимся о переполнении или знаем что оно не может произойти, мы может игнорировать этот сигнал, т.е. никуда его не подключать.
С другой стороны, если мы захотим вызвать две разные функции для реакции на эту ошибку, тогда просто подключаем эту функцию к двум разным слотам. Qt вызовет их оба (в произвольном порядке).

  1. public slots:
  2. void display(int num);
  3. void display(double num);
  4. void display(const QString &str);
  5. void setHexMode();
  6. void setDecMode();
  7. void setOctMode();
  8. void setBinMode();
  9. void setSmallDecimalPoint(bool point);
  10. };
  11. #endif

* This source code was highlighted with Source Code Highlighter.


Слоты это функции, используемые для получения информации об изменениях состояний других виджетов. LcdNumber использует их, как показано в коде выше, для установки отображаемого числа. Так как функция display() часть интерфейса класса с остальной программой, этот слот публичный.
Стоит отметить что функция display() перегружена. Qt выберет подходящую версию при соединении сигнала и слота. С обратным вызовом нам бы пришлось искать пять разных имен и контролировать типы самостоятельно.
Некоторые незначительные функции-члены были опущены в данном примере.

 

Лабораторная работа Qt.

Задание 1.

Создайте окно, на котором вы сможете увидеть кнопку Выход, ползунок и элемент, который будет выводить значение ползунка. Не забудьте, что кнопка выход должна действительно закрывать приложение. Возможно, материал из лекций как-то поможет вам в реализации данного задания. Скорее всего, у вас появится соблазн не описывать все элементы, а воспользоваться QtDesigner, однако это было бы крайне нежелательно, потому что работа с ним вызовет вопросов на гораздо большее время, чем отведено на лабораторную.

Задание 2.

В безусловно получившееся окно добавьте виджет, который бы был полем для нашего рисования и нарисуйте на нём сектор круга в понравившемся вам нижнем углу, если вы нечётная бригада, или же прямоугольник в понравившемся вам месте нижнего края виджета, если вы чётная бригада. Не стесняйтесь заглянуть в лекцию за функциями, и помните, что всегда можно посмотреть более подробную по ним информацию, наведя на название класса и нажав F1

Задание 3.

А) Повеселившись с рисованием одного примитива, вы наверняка втянулись в этот процесс, а потому, подрисуйте к вашей фигуре прямоугольник так, чтобы получившаяся фигура была похожа на пушку.

Б) Привяжите ваш ползунок из пункта 1 к вашей получившейся фигуре, подозрительно напоминающей пушку, и сделайте так, чтобы при изменении значения ползунка менялся или угол наклона прямоугольника или положение прямоугольника на нижней грани.

Задание 4.

Вполне возможно, что до сюда никто уже и не доберётся, но если же вы работали в ударном темпе, то вот вам награда – больше заданий. Итак, пункт А гласит:

Используя таймер и кнопку, сымитируйте выстрел из воображаемой пушки который пойдёт ровно по прямой, пока не доберется до границы. Во время полёта запретите возможность стрелять ещё раз.

Пункт Б:

Создайте третий объект, который будет появляться в случайном месте и который будет использоваться как воробей. Не забудьте создавать новый объект и убирать старый, если вы попали.

Задание 5.

Итак, пункт 5, он же последний.

А) Сделайте так, чтобы при нажатии на клавиши стрелок, наша пушка двигалась или же меняла угол наклона.

Б) Проявите фантазию и добавьте что-либо интерактивное по своему вкусу. Уверен, преподаватель оценит это.

 

<== предыдущая лекция | следующая лекция ==>
Небольшой пример | Учебное пособие
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 287; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.