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

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

Жанры

Основы программирования в 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
— невидимые объекты-контейнеры, хранящие другие виджеты и схемы размещения с вертикальной и горизонтальной ориентациями соответственно. Вы сможете создавать сколь угодно сложные компоновки виджетов, поскольку допускается использование вложенных компоновок, например, за счет вставки как элемента горизонтальной схемы размещения внутрь вертикального упаковочного контейнера.

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

Тарзан (Сборник рассказов)

Берроуз Эдгар Райс
Тарзан
Приключения:
природа и животные
7.80
рейтинг книги
Тарзан (Сборник рассказов)

Маркс и Энгельс

Серебрякова Галина Иосифовна
421. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Маркс и Энгельс

Газлайтер. Том 3

Володин Григорий Григорьевич
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Реальная угроза

Клэнси Том
4. Джек Райан
Детективы:
боевики
5.75
рейтинг книги
Реальная угроза

Антология «Дракула»

Морган Крис
Фантастика:
ужасы и мистика
мистика
фэнтези
городское фэнтези
5.00
рейтинг книги
Антология «Дракула»

Газлайтер. Том 40

Володин Григорий Григорьевич
40. История Телепата
Фантастика:
альтернативная история
аниме
попаданцы
6.25
рейтинг книги
Газлайтер. Том 40

На горах

Мельников-Печерский Павел Иванович
Проза:
классическая проза
8.87
рейтинг книги
На горах

Париж

Резерфорд Эдвард
The Big Book
Проза:
историческая проза
7.40
рейтинг книги
Париж

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Враг из прошлого тысячелетия

Я еще царь. Книга XXX

Дрейк Сириус
30. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.75
рейтинг книги
Я еще царь. Книга XXX

Трилогия «Хроники Сиалы»

Пехов Алексей Юрьевич
3. В одном томе
Фантастика:
фэнтези
9.47
рейтинг книги
Трилогия «Хроники Сиалы»

Сравнительные жизнеописания

Плутарх
Документальная литература:
биографии и мемуары
8.85
рейтинг книги
Сравнительные жизнеописания

Эндимион. Восход Эндимиона

Симмонс Дэн
Гиперион
Фантастика:
научная фантастика
космическая фантастика
8.36
рейтинг книги
Эндимион. Восход Эндимиона

Город Бездны

Рейнольдс Аластер
1. Космический апокалипсис
Фантастика:
научная фантастика
космическая фантастика
6.71
рейтинг книги
Город Бездны