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

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

Жанры

Основы программирования в Linux
Шрифт:

#include <qapplication.h>

#include <iostream>

3. В конструкторе вы задаете заголовок окна, создаете кнопку и связываете сигнал нажатия кнопки с вашим слотом.

setCaption
— метод объектов типа
QMainWindow
, который, что неудивительно, задает заголовок окна:

ButtonWindow::ButtonWindow(QWidget *parent, const char* name) : QMainWindow(parent, name) {

 this->setCaption("This is the window Title");

 QPushButton *button = new QPushButton("Click Me!", this, "Button1");

 button->setGeometry(50, 30, 70, 20);

 connect(button, SIGNAL(clicked), this, SLOT(Clicked));

}

4. Qt автоматически удаляет виджеты, поэтому ваш деструктор пуст:

ButtonWindow::~ButtonWindow {}

5. Затем реализация слота:

void ButtonWindow::Clicked(void) {

 std::cout << "clicked!\n";

}

6. И наконец, в функции

main
вы просто создаете экземпляр типа
ButtonWindow
, делаете его главным окном вашего приложения и отображаете окно на экране:

int main(int argc, char **argv) {

 QApplication app(argc, argv);

 ButtonWindow *window = new ButtonWindow;

 app.setMainWidget(window);

 window->show;

 return app.exec;

}

7. Прежде чем вы сможете откомпилировать данный пример, необходимо запустить препроцессор для заголовочного файла. Программа этого препроцессора называется Meta Object Compiler (moc, компилятор метаобъекта) и должна быть включена в пакет комплекта Qt. Выполните

moc
для файла ButtonWindow.h, сохранив результат в файле ButtonWindow.moc:

$ moc ButtonWindow.h -о ButtonWindow.moc

Теперь можно компилировать как обычно, скомпоновав с результатом команды

moc
.

$ g++ -о button ButtonWindow.срр -I$QTDIR/include -L$QTDIR/lib -lqui

Выполнив программу, вы получите пример, показанный на рис. 17.3.

Рис. 17.3 

Как это работает

В этом примере мы ввели новый виджет и некоторые новые функции, поэтому давайте их рассмотрим.

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

Конструктор объекта

QPushButton
очень прост.

QPushButton::QPushButton(const QString &text, QWidget *parent,

 const char* name=0);

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

Параметр родительского виджета, общий для всех объектов, —

QWidget
, он управляет отображением и уничтожением и разными другими свойствами. Передача
NULL
в качестве родительского объекта означает виджет верхнего уровня, при этом создается содержащее его пустое окно. В примере вы передаете текущий объект
ButtonWindow
с помощью ключевого слова
this
, что приводит к вставке кнопки в основную область окна
ButtonWindow
.

Аргумент

name
задает имя виджета для внутреннего использования Qt. Если комплект Qt обнаружит ошибку, имя виджета будет выведено в сообщении об ошибке, поэтому неплохо выбирать подходящие имена виджетов, поскольку при отладке это сбережет массу времени.

Вы могли заметить, что объект

QPushButton
очень примитивно вставляется в окно
ButtonWindow
, с помощью параметра parent конструктора
QPushButton
, без указания положения кнопки, ее размера, рамки или чего-либо еще. Если вы хотите управлять внешним видом кнопки, что очень важно для создания привлекательного интерфейса, следует применять виджеты компоновки комплекта Qt. Давайте их сейчас рассмотрим,

В Qt есть целый ряд способов размещения и компоновки виджетов. Вы уже видели использование абсолютных координат с помощью вызова

setGeometry
, но они редко применяются, поскольку виджеты не масштабируются и не меняют размеры при изменении величины окна.

Предпочтительный метод компоновки виджетов — применение классов

QLayout
или виджетов-контейнеров, которые изменяют свои размеры соответствующим образом после задания им подсказок, касающихся отступов и расстояний между виджетами.

Ключевое различие между классами

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

Классы компоновки — потомки объектов, типа

QObject
, а не
QWidget
, поэтому их применение ограничено. Например, вы не можете создать объект
QVBoxLayout
— основной виджет объекта
QMainWindow
.

Виджеты упаковочных контейнеров (такие, как

QHBox
и
QVBox
) напротив — потомки объекта типа
QWidget
следовательно, вы можете применять их как обычные виджеты. Возможно, вас удивляет, что в Qt есть и классы
QLayout
, и виджеты
QBox
с дублирующимися функциональными возможностями. На самом деле виджеты
QBox
существуют только для удобства и по существу служат оболочкой классов
QLayout
в типе
QWidget
. Объекты
QLayout
обладают возможностью автоматического изменения размеров, в то время как размеры виджетов нужно изменять вручную с помощью вызова метода
QWidget::resizeEvent
.

Подклассы

QLayout
:
QVBoxLayout
и
QHBoxLayout
, — самый распространенный способ создания интерфейса, и именно их вы будете чаще всего встречать в программном коде с применением Qt.

QVBoxLayout
и
QHBoxLayout
— невидимые объекты-контейнеры, хранящие другие виджеты и схемы размещения с вертикальной и горизонтальной ориентациями соответственно. Вы сможете создавать сколь угодно сложные компоновки виджетов, поскольку допускается использование вложенных компоновок, например, за счет вставки как элемента горизонтальной схемы размещения внутрь вертикального упаковочного контейнера.

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

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник

Точка Бифуркации VIII

Смит Дейлор
8. ТБ
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации VIII

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Бастард

Майерс Александр
1. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард

Моя простая курортная жизнь 4

Блум М.
4. Моя простая курортная жизнь
Любовные романы:
эро литература
5.00
рейтинг книги
Моя простая курортная жизнь 4

Я до сих пор князь. Книга XXII

Дрейк Сириус
22. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор князь. Книга XXII

На цепи

Уваров
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
На цепи

Черный Маг Императора 18

Герда Александр
18. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 18

Перешагнуть пропасть

Муравьёв Константин Николаевич
1. Перешагнуть пропасть
Фантастика:
боевая фантастика
космическая фантастика
8.38
рейтинг книги
Перешагнуть пропасть

Воронцов. Перезагрузка. Книга 3

Тарасов Ник
3. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 3

Лекарь Империи 9

Карелин Сергей Витальевич
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Лекарь Империи 9

Кай из рода красных драконов 2

Бэд Кристиан
2. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов 2

Как я строил магическую империю 5

Зубов Константин
5. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 5

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12