- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
QT 4: программирование GUI на С++ - Жасмин Бланшет
Шрифт:
Интервал:
Закладка:
Многие приложения при запуске выводят на экран заставки. Некоторыми разработчиками заставки используются, чтобы сделать менее заметным медленный запуск приложения, а в других случаях это делается для удовлетворения требований отделений, отвечающих за маркетинг. Можно очень просто добавить заставку в приложение Qt, используя класс QSplashScreen.
Класс QSplashScreen выводит на экран изображение до появления главного окна. Он также может вывести на изображение сообщение, информирующее пользователя о ходе процесса инициализации приложения. Обычно вызов заставки делается в функции main() до вызова функции QApplication::exec().
Ниже приводится пример функции main(), которая использует QSplashScreen для вывода заставки приложения, которое загружает модули и устанавливает сетевые соединения при запуске.
01 int main(int argc, char *argv[])
02 {
03 QApplication app(argc, argv);
04 QSplashScreen *splash = new QSplashScreen;
05 splash->setPixmap(QPixmap(":/images/splash.png"));
06 splash->show();
07 Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
08 splash->showMessage(QObject::tr("Setting up the main window…"),
09 topRight, Qt::white);
10 MainWindow mainWin;
11 splash->showMessage(QObject::tr("Loading modules…"),
12 topRight, Qt::white);
13 loadModules();
14 splash->showMessage(QObject::tr("Establishing connections…"),
15 topRight, Qt::white);
16 establishConnections();
17 mainWin.show();
18 splash->finish(&mainWin);
19 delete splash;
20 return app.exec();
21 }
Рис. 3.18. Экранная заставка.
Теперь мы завершили пользовательский интерфейс приложения Электронная таблица. В следующей главе мы реализуем базовые функции электронной таблицы и на этом завершим построение этого приложения.
Глава 4. Реализация функциональности приложения
В двух предыдущих главах мы показали способы создания пользовательского интерфейса приложения Электронная таблица. В данной главе мы завершим программирование функций, обеспечивающих работу этого интерфейса. Кроме того, мы рассмотрим способы загрузки и сохранения файлов, хранения данных в памяти, реализации операций с буфером обмена (clipboard) и добавления поддержки формул электронной таблицы к классу QTableWidget.
Центральный виджет
Центральную область QMainWindow может занимать любой виджет. Ниже дается краткий обзор возможных вариантов.
1. Стандартный виджет Qt
В качестве центрального могут использоваться стандартные виджеты, например QTableWidget или QTextEdit. В данном случае такие функции, как загрузка и сохранение файлов, должны быть реализованы в другом месте (например, в подклассе QMainWindow).
2. Пользовательский виджет
В специализированных приложениях часто требуется показывать данные в пользовательском виджете. Например, программа редактирования пиктограмм могла бы в качестве центрального использовать виджет IconEditor. В главе 5 рассматриваются способы написания пользовательских виджетов с помощью средств разработки Qt.
3. Базовый виджет QWidget с менеджером компоновки
Иногда в центральной области приложения размещается много виджетов. Это можно сделать путем применения QWidget в качестве родительского виджета по отношению ко всем другим виджетам и использовать менеджеры компоновки для задания дочерним виджетам их размера и положения.
4. Разделитель
Другой способ размещения в центральной области нескольких виджетов заключается в применении разделителя QSplitter. QSplitter размещает свои дочерние виджеты по горизонтали или по вертикали и предоставляет пользователю некоторые возможности по управлению размерами виджетов. Разделители могут содержать любые виджеты, включая другие разделители.
5. Рабочая область (workspace) интерфейса MDI
Если в приложении используется интерфейс MDI, центральную область будет занимать виджет QWorkspace, а каждое окно интерфейса MDI будет являться дочерним виджетом.
Менеджеры компоновки, разделители и рабочие области MDI могут использоваться совместно со стандартными виджетами Qt или с пользовательскими виджетами. В главе 6 подробно рассматриваются эти классы.
В приложении Электронная таблица в качестве центрального виджета применяется некоторый подкласс класса QTableWidget. Класс QTableWidget уже обеспечивает большинство необходимых нам функций электронной таблицы, но он не может понимать формулы электронной таблицы вида «=Al+A2+A3» и не поддерживает операции с буфером обмена. Мы реализуем эти недостающие функции в классе Spreadsheet, который наследует QTableWidget.
Создание подкласса QTableWidget
Класс Spreadsheet наследует QTableWidget. Виджет QTableWidget фактически является сеткой, представляющей собой двумерный разряженный массив. На нем отображается часть ячеек всей сетки, полученная при прокрутке изображения пользователем. При вводе пользователем текста в пустую ячейку QTableWidget автоматически создает элемент QTableWidgetItem для хранения текста.
Давайте начнем с реализации виджета и сначала приведем заголовочный файл:
01 #ifndef SPREADSHEET_H
02 #define SPREADSHEET_H
03 #include <QTableWidget>
04 class Cell;
05 class SpreadsheetCompare;
Заголовочный файл начинается с предварительных объявлений классов Cell и SpreadsheetCompare.
Рис. 4.1. Деревья наследования для классов Spreadsheet и Cell.
Такие атрибуты ячейки QTableWidget, как ее текст и выравнивание, хранятся в QTableWidgetltem. В отличие от QTableWidget, класс QTableWidgetltem не является виджетом; это обычный класс данных. Класс Cell наследует QTableWidgetltem, и мы рассмотрим этот класс в последнем разделе данной главы, где представим его реализацию.
06 class Spreadsheet : public QTableWidget
07 {
08 Q_OBJECT
09 public:
10 Spreadsheet(QWidget *parent = 0);
11 bool autoRecalculate() const { return autoRecalc; }
12 QString currentLocation() const;
13 QString currentFormula() const;
14 QTableWidgetSelectionRange selectedRange() const;
15 void clear();
16 bool readFile(const QString &fileName);
17 bool writeFile(const QString &fileName);
18 void sort(const SpreadsheetCompare &compare);
Функция autoRecalculate() реализуется как встроенная (inline), поскольку она лишь показывает, задействован или нет режим автоматического перерасчета.
В главе 3 мы опирались на использование некоторых открытых функций класса электронной таблицы Spreadsheet при реализации MainWindow Например, из MainWindow::newFile() мы вызывали функцию clear() для очистки электронной таблицы. Кроме того, мы вызывали некоторые функции, унаследованные от QTableWidget, а именно setCurrentCell() и setShowGrid().
19 public slots:
20 void cut();
21 void copy();
22 void paste();
23 void del();
24 void selectCurrentRow();
25 void selectCurrentColumn();
26 void recalculate();
27 void setAutoRecalculate(bool recalc);
28 void findNext(const QString &str, Qt::CaseSensitivity cs);
29 void findPrevious(const QString &str, Qt::CaseSensitivity cs);
30 signals:
31 void modified();
Класс Spreadsheet содержит много слотов, которые реализуют действия пунктов меню Edit, Tools и Options, и он содержит один сигал modified() для уведомления о возникновении любого изменения.
32 private slots:
33 void somethingChanged();
Мы определяем один закрытый слот, который используется внутри класса Spreadsheet.
34 private:
35 enum { MagicNumber = 0x7F51C883, RowCount = 999, ColumnCount = 26 };
36 Cell *cell(int row, int column) const;
37 QString text(int row, int column) const;
38 QString formula(int row, int column) const;
39 void setFormula(int row, int column, const QString &formula);
40 bool autoRecalc;
41 };
В закрытой секции этого класса мы объявляем три константы, четыре функции и одну переменную.
42 class SpreadsheetCompare
43 {
44 public:
45 bool operator()(const QStringList &row1, const QStringList &row2) const;
46 enum { KeyCount = 3 };
47 int keys[KeyCount];
48 bool ascending[KeyCount];
49 };
50 #endif
Заголовочный файл заканчивается определением класса SpreadsheetCompare. Мы объясним назначение этого класса при рассмотрении функции Spreadsheet::sort().

