Жасмин Бланшет - QT 4: программирование GUI на С++ Страница 16
- Категория: Компьютеры и Интернет / Программирование
- Автор: Жасмин Бланшет
- Год выпуска: -
- ISBN: -
- Издательство: -
- Страниц: 123
- Добавлено: 2019-05-29 11:13:56
Жасмин Бланшет - QT 4: программирование GUI на С++ краткое содержание
Прочтите описание перед тем, как прочитать онлайн книгу «Жасмин Бланшет - QT 4: программирование GUI на С++» бесплатно полную версию:Единственное официальное руководстро по практическому программированию в среде Qt 4.1.Применяя средства разработки Qt компании «Trolltech», вы сможете создавать на С++ промышленные приложения, которые естественно работают в средах Windows, Linux/UNIX, Linux для встроенных систем без изменения программного кода и Mac Os X. Книга написана сотрудниками компании «Trolltech». Она представляет собой практическое руководство по успешному применению самой мощной из всех созданных до сих пор версий Qt — Qt 4.1.Из книги «Qt 4: программирование GUI на С++» вы узнаете о наиболее эффективных приемах и методах программирования с применением Qt 4 и овладеете ключевыми технологиями в самых различных областях — от архитектуры Qt модель/представление до мощного графического процессора 2D. Авторы вооружают читателей беспрецедентно глубокими знаниями модели событий и системы компоновки Qt.На реалистических примерах они описывают высокоэффективные методы во всех областях — от разработки основных элементов графического пользовательского интерфейса до передовых методов интеграции с базой данных и XML. Каждая глава содержит полностью обновленный материал.Данное издание:• Включает новые главы по архитектуре Qt 4 модель/представление и поддержке подключаемых модулей Qt, а также краткое введение в программирование встроенных систем на платформе Qtopia.• Раскрывает все основные принципы программирования в среде Qt — от создания диалоговых и других окон до реализации функциональности приложений.• Знакомит с передовыми методами управления компоновкой виджетов и обработкой событий.• Показывает, как можно с наибольшей эффективностью использовать новые программные интерфейсы Qt 4, в частности мощный графический процессор 2D и новые простые в применении классы—контейнеры.• Представляет передовые методы Qt 4, которых нет ни в одной книге: от создания подключаемых модулей, расширяющих возможности Qt, и приложений, до применения «родных» для конкретной платформы программных интерфейсов.• Содержит приложение с подробным введением в программирование на С++ в среде Qt для опытных Java—разработчиков.Жасмин Бланшет (Jasmine Blanchette) — менеджер по документированию и старший разработчик компании «Trolltech» с 2001 года. Он является редактором «Qt Quarterly», информационного бюллетеня компании «Trolltech», и соавтором книги «Qt 3: программирование GUI на С++».Марк Саммерфилд (Mark Summerfield) — независимый преподаватель и консультант по С++, Qt и Python. Он работал менеджером по документированию в компании «Trolltech» на протяжении трех лет. Марк является соавтором книги «Qt 3: программирование GUI на С++».
Жасмин Бланшет - QT 4: программирование GUI на С++ читать онлайн бесплатно
В обоих случаях мы будем выдавать сообщение в строке состояния в течение 2 секунд (2000 миллисекунд) для того, чтобы пользователь знал о выполняемых приложением действиях.
01 bool MainWindow::save()
02 {
03 if (curFile.isEmpty()) {
04 return saveAs();
05 } else {
06 return saveFile(curFile);
07 }
08 }
09 bool MainWindow::saveFile(const QString &fileName)
10 {
11 if (!spreadsheet->writeFile(fileName)) {
12 statusBar()->showMessage(tr("Saving canceled"), 2000);
13 return false;
14 }
15 setCurrentFile(fileName);
16 statusBar()->showMessage(tr("File saved"), 2000);
17 return true;
18 }
Слот save() соответствует пункту меню File | Save. Если файл уже имеет имя, потому что уже открывался до этого или уже сохранялся, слот save() вызывает saveFile(), задавая это имя; в противном случае он просто вызывает saveAs().
01 bool MainWindow::saveAs()
02 {
03 QString fileName = QFileDialog::getSaveFileName(this,
04 tr("SaveSpreadsheet"),
05 tr("Spreadsheet files (*.sp)"));
06 if (fileName.isEmpty())
07 return false;
08 return saveFile(fileName);
09 }
Слот saveAs() соответствует пункту меню File | Save As. Мы вызываем QFileDialog::getSaveFileName() для получения имени файла от пользователя. Если пользователь нажимает кнопку Cancel, мы возвращаем значение false, которое передается дальше вплоть до вызвавшей функции (save() или okToContinue()).
Если файл с данным именем уже существует, функция getSaveFileName() попросит пользователя подтвердить его перезапись. Такое поведение можно предотвратить, передавая функции getSaveFileName() дополнительный аргумент QFileDialog::DontConfirmOverwrite.
01 void MainWindow::closeEvent(QCloseEvent *event)
02 {
03 if (okToContinue()) {
04 writeSettings();
05 event->accept();
06 } else {
07 event->ignore();
08 }
09 }
Когда пользователь выбирает пункт меню File | Exit или щелкает по кнопке X заголовка окна, вызывается слот QWidget::close(). В результате будет сгенерировано событие виджета «close» (закрытие). Переопределяя функцию QWidget::closeEvent(), мы можем перехватывать команды по закрытию главного окна и принимать решения относительно возможности его фактического закрытия.
Если изменения не сохранены и пользователь нажимает кнопку Cancel, мы «игнорируем» это событие, и оно никак не повлияет на окно. В обычном случае мы реагируем на это событие, и в результате Qt закроет окно. Мы вызываем также закрытую функцию writeSettings() для сохранения текущих настроек приложения.
Когда закрывается последнее окно, приложение завершает работу. При необходимости мы можем отменить такой режим работы, устанавливая свойство quitOnLastWindowClosed класса QApplication на значение false, и в результате приложение продолжит выполняться до тех пор, пока мы не вызовем функцию QApplication::quit().
01 void MainWindow::setCurrentFile(const QString &fileName)
02 {
03 curFile = fileName;
04 setWindowModified(false);
05 QString shownName = "Untitled";
06 if (!curFile.isEmpty()) {
07 shownName = strippedName(curFile);
08 recentFiles.removeAll(curFile);
09 recentFiles.prepend(curFile);
10 updateRecentFileActions();
11 }
12 setWindowTitle(tr("%1[*] - %2").arg(shownName)
13 .arg(tr("Spreadsheet")));
14 }
15 QString MainWindow::strippedName(const QString &fullFileName)
16 {
17 return QFileInfo(fullFileName).fileName();
18 }
В функции setCurrentFile() мы задаем значение закрытой переменной curFile, в которой содержится имя редактируемого файла. Перед тем как отобразить имя файла в заголовке, мы убираем путь к файлу с помощью функции strippedName(), чтобы имя файла выглядело более привлекательно.
Каждый QWidget имеет свойство windowModified, которое должно быть установлено на значение true, если документ окна содержит несохраненные изменения, и на значение false в противном случае. В системе Mac OS X несохраненные документы отмечаются точкой на кнопке закрытия, расположенной в заголовке окна, в других системах такие документы отмечаются звездочкой в конце имени файла. Все это обеспечивается в Qt автоматически, если мы своевременно обновляем свойство windowModified и помещаем маркер «[*]» в заголовок окна по мере необходимости.
В функцию setWindowTitle() мы передали следующий текст:
tr("%1[*] - %2").arg(shownName)
.arg(tr("Spreadsheet"))
Функция QString::arg() заменяет своим аргументом параметр «%n» с наименьшим номером и возвращает полученную строку. В нашем случае arg() имеет два параметра «%n». При первом вызове функция arg() заменяет параметр «%1»; второй вызов заменяет «%2». Если файл имеет имя «budget.sp» и файл перевода не загружен, мы получим строку «budget.sp[*] — Spreadsheet». Проще написать:
setWindowTitle(shownName + tr("[*] - Spreadsheet"));
но применение arg() облегчает перевод сообщения на другие языки.
Если задано имя файла, мы обновляем recentFiles — список имен файлов, которые открывались в приложении недавно. Мы вызываем функцию removeAll() для удаления всех файлов с этим именем из списка, чтобы избежать дублирования; затем мы вызываем функцию prepend() для помещения имени данного файла в начало списка. После обновления списка имен файлов мы вызываем функцию updateRecentFileActions() для обновления пунктов меню File.
01 void MainWindow::updateRecentFileActions()
02 {
03 QMutableStringListIterator i(recentFiles);
04 while (i.hasNext()) {
05 if (!QFile::exists(i.next()))
06 i.remove();
07 }
08 for (int j = 0; j < MaxRecentFiles; ++j) {
09 if (j < recentFiles.count()) {
10 QString text = tr("&%1 %2")
11 .arg(j + 1)
12 .arg(strippedName(recent Files[j]));
13 recentFileActions[j]->setText(text);
14 recentFileActions[j]->setData(recentFiles[j]);
15 recentFileActions[j]->setVisible(true);
16 } else {
17 recentFileActions[j]->setVisible(false);
18 }
19 }
20 separatorAction->setVisible(!recentFiles.isEmpty());
21 }
Сначала мы удаляем все файлы, которые больше не существуют, используя итератор в стиле Java. Некоторые файлы могли использоваться в предыдущем сеансе, но с этого момента их уже не будет. Переменная recentFiles имеет тип QStringList (список QStrings). В главе 11 подробно рассматриваются такие классы—контейнеры, как QStringList, и их связь со стандартной библиотекой шаблонов С++ (Standard Template Library — STL), a также применение в Qt классов итераторов в стиле Java.
Затем мы снова проходим по списку файла, на этот раз пользуясь индексацией массива. Для каждого файла мы создаем строку из амперсанда, номера файла (j + 1), пробела и имени файла (без пути). Для соответствующего пункта меню мы задаем этот текст. Например, если первым был файл С:\My Documents\tab04.sp, пункт меню первого недавно используемого файла будет иметь текст «&1 tab04.sp».
Рис. 3.11. Меню File со списком файлов, которые открывались недавно.
С каждым пунктом меню recentFileActions может быть связан элемент данных «data» типа QVariant. Тип QVariant может хранить многие типы С++ и Qt; он рассматривается в гл. 11. Здесь в элементе меню «data» мы храним полное имя файла, чтобы позже можно было легко его найти. Мы также делаем этот пункт меню видимым.
Если пунктов меню (массив recentFileActions) больше, чем недавно открытых файлов (массив recentFiles), мы просто не отображаем дополнительные пункты. Наконец, если существует по крайней мере один недавно используемый файл, мы делаем разделитель видимым.
01 void MainWindow::openRecentFile()
02 {
03 if (okToContinue()) {
04 QAction *action = qobject_cast<QAction *>(sender());
05 if (action)
06 loadFile(action->data(). toString());
07 }
08 }
При выборе пользователем какого-нибудь недавно используемого файла вызывается слот openRecentFile(). Функция okToContinue() используется в том случае, когда имеются несохраненные изменения, и если пользователь не отменил сохранение изменений, мы определяем, какой конкретный пункт меню вызвал слот, используя функцию QObject::sender().
Функция qobject_cast<T>() выполняет динамическое приведение типов на основе мета―информации, сгенерированной moc — компилятором мета—объектов Qt. Она возвращает указатель на запрошенный подкласс QObject или 0, если нельзя объект привести к данному типу. В отличие от функции dynamic_cast<T>() стандартного С++, функция Qt qobject_cast<T>() работает правильно за пределами динамической библиотеки. В нашем примере мы используем qobject_cast<T>() для приведения указателя QObject в указатель QAction. Если приведение удачно (а оно должно быть удачным), мы вызываем функцию loadFile(), задавая полное имя файла, которое мы извлекаем из элемента данных пункта меню.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.