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

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

Жанры

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

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

Шрифт:

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

При добавлении внутренних менеджеров компоновки к родительскому менеджеру компоновки (строки 25, 33 и 34) для них автоматически устанавливается родительская связь. Затем, когда главный менеджер компоновки устанавливается для диалога (строка 35), он становится дочерним элементом диалога и все виджеты в менеджерах компоновки становятся дочерними элементами диалога. Иерархия полученных родословных связей представлена на рис. 2.3.

Рис. 2.3. Родословная объектов диалогового окна поиска данных.

36 setWindowTitle(tr("Find"));

37 setFixedHeight(sizeHint.height);

38 }

Наконец, мы задаем название диалогового окна и устанавливаем фиксированной его высоту, поскольку в диалоговом окне нет виджетов, которым может понадобиться дополнительное пространство по вертикали. Функция QWidget::sizeHint возвращает «идеальный» размер виджета.

На этом завершается рассмотрение конструктора FindDialog. Поскольку нами использован оператор new при создании виджетов и менеджеров компоновки, нам, по-видимому, придется написать деструктор, где будут предусмотрены операторы delete для удаления каждого созданного нами виджета и менеджера компоновки. Но поступать так не обязательно, поскольку Qt автоматически удаляет дочерние объекты при разрушении родительского объекта, а все дочерние виджеты и менеджеры компоновки являются потомками FindDialog.

Теперь мы рассмотрим слоты диалогового окна:

39 void FindDialog::findClicked

40 {

41 QString text = lineEdit->text;

42 Qt::CaseSensitivity cs =

43 caseCheckBox->isChecked ? Qt::CaseSensitive

44 : Qt::CaseInsensitive;

45 if (backwardCheckBox->isChecked) {

46 emit findPrevious(text, cs);

47 } else {

48 emit findNext(text, cs);

49 }

50 }

51 void FindDialog::enableFindButton(const QString &text)

52 {

53 findButton->setEnabled(!text.isEmpty);

54 }

Слот findClicked вызывается при нажатии пользователем кнопки Find. Он генерирует сигнал findPrevious или findNext в зависимости от состояния флажка Search backward (поиск в обратном направлении). Ключевое слово emit (генерировать сигнал) имеет особый смысл в Qt; как и другие расширения Qt, оно преобразуется препроцессором С++ в стандартные инструкции С++.

Слот enableFindButton вызывается при любом изменении значения в строке редактирования. Он устанавливает активный режим кнопки, если в редактируемой строке имеется какой-нибудь текст; в противном случае кнопка устанавливается в неактивный режим.

Эти два слота завершают написание программы диалогового окна. Теперь мы можем создать файл main.cpp и протестировать наш виджет FindDialog:

01 #include <QApplication>

02 #include "finddialog.h"

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

04 {

05 QApplication app(argc, argv);

06 FindDialog *dialog = new FindDialog;

07 dialog->show;

08 return app.exec;

09 }

Для компиляции этой программы выполните обычную команду qmake. Поскольку определение класса FindDialog содержит макрос Q_OBJECT, сформированный командой qmake, файл makefile будет содержать специальные правила для запуска moc — мета—объектного компилятора Qt. (Мета—объектная система Qt рассматривается в следующем разделе.)

Для правильной работы moc мы должны включить определение класса в заголовочный файл, то есть отделить его от файла реализации класса. Сформированный moc программный код содержит этот заголовочный файл и собственно сгенерированные инструкции С++.

Классы с макросом Q_OBJECT сначала должны пройти через компилятор moc. Здесь не будет проблем, поскольку qmake автоматически добавляет в файл makefile необходимые команды. Однако если вы забудете сгенерировать файл makefile командой qmake, программа не пройдет через компилятор moc и компоновщик программы пожалуется на то, что некоторые объявленные функции не реализованы. Эти сообщения могут выглядеть достаточно странно. GCC выдает сообщения следующего вида:

finddialog.o(.text+0x28): undefined reference to

'FindDialog::QPaintDevice virtual table'

(не определена ссылка на «виртуальную таблицу

FindDialog::QPaintDevice»)

finddialog.o: In function 'FindDialog::tr(char const*. char const*)':

/usr/lib/qt/src/corelib/global/qglobal.h:1430: undefined reference to

'FindDialog::staticMetaObject'

(В функции 'FindDialog::tr(…)' не определена ссылка на

'FindDialog::staticMetaObject')

Сообщения в Visual С++ выглядят следующим образом:

finddialog.obj : error LNK2001: unresolved external symbol

"public:~virtual int __thiscall MyClass::qt_metacall(enum QMetaObject::Call,int,void * *)"

(ошибка LNK2001: неразрешенная внешняя ссылка)

При появлении подобных сообщений снова выполните команду qmake для обновления файла makefile, затем заново постройте приложение.

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

Старый, но крепкий 2

Крынов Макс
2. Культивация без насилия
Фантастика:
рпг
уся
эпическая фантастика
5.00
рейтинг книги
Старый, но крепкий 2

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

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

Мир в латах (сборник)

Полякова Татьяна Викторовна
Фантастика:
социально-философская фантастика
научная фантастика
5.00
рейтинг книги
Мир в латах (сборник)

Страж Кодекса. Книга IV

Романов Илья Николаевич
4. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга IV

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

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

Курс 1. Сентябрь

Фокс Гарри
1. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Курс 1. Сентябрь

Мой муж – чудовище! Изгнанная жена дракона

Терин Рем
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Мой муж – чудовище! Изгнанная жена дракона

#НенавистьЛюбовь

Джейн Анна
Любовные романы:
современные любовные романы
6.33
рейтинг книги
#НенавистьЛюбовь

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

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

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

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

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Рассказы

Крапивин Владислав Петрович
Детские:
прочая детская литература
5.00
рейтинг книги
Рассказы

Иван Грозный: Кровавый поэт

Бушков Александр Александрович
Научно-образовательная:
история
6.67
рейтинг книги
Иван Грозный: Кровавый поэт

В теле пацана 6

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