русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Практическая часть


Дата добавления: 2015-07-04; просмотров: 894; Нарушение авторских прав


Хотелось ли Вам иметь быстрый и красивый, а главное удобный просмотрщик графики? А, как известно: хочешь, чтобы программа была хорошей – напиши ее своими руками.

Всем надоел стандартный просмотрщик Windows! Вместо него мы сделаем прекрасный и ультрасовременный Viewer – QViewer!

Дальнейшая последовательность действий почти аналогична той, что мы проделывали при создании видеоплеера. Посему приведу сокращенный вариант.

 

1. Запустите Qt Creator. Снова воспользуемся мастером.

Выберите Файл - Новый файл или проект…, а там Приложение Qt Widgets.

 

Рис. 7.0. Создание проекта Qt-приложения с помощью мастера

 

Дадим ему имя QViwer, укажем месторасположение проекта и нажмем Далее (3 раза) и Завершить.

 

2. Займемся созданием и редактированием действий.

 

2.1. Создайте стандартное меню Файл с пунктами Открыть, Выход.

Между Открыть и Выход добавьте разделитель.

Дадим им имена action_Open и action_Quit соответственно, а также добавим к ним горячие комбинации клавиш: Ctrl+O, Ctrl+Q. Для action_Quit см. рис. 6.1 (да-да, это ссылка на 6 лабораторную работу, но вы можете не листать странички, если помните, что делать).

 

Теперь приступим к action_Open, зададим иконку (предварительно создав и подключив файл ресурсов), бросим на панель инструментов, нажмем правой копкой мыши на action_Open в редакторе действий и выберем: Перейти к слоту…, далее см. рис. 6.2, жмакаем ОК.

QString last_open_dir="";

QString File_Name = QFileDialog::getOpenFileName(this, tr("Open Image"), last_open_dir, tr("Image Files (*.png *.jpg *.bmp)"));

if (!File_Name.isNull())

{

QImage image(File_Name);

if (image.isNull())

{

QMessageBox::information(this, tr("Image Viewer"),tr("Cannot load %1.").arg(File_Name));



return;

}

imageLabel->setPixmap(QPixmap::fromImage(image));

imageLabel->adjustSize();

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

Напомню также о необходимости испольхования двойного слэша при написании адреса, например: "D:\\Photo_2\\Fall\\"

Если же в названии будут присутствовать русские символы – см. л.р. №5.

 

Во-вторых, следует подключить (в заголовочном файле):

#include <QImage>

#include <QtGui>

#include <QFileDialog>

а также описать переменную (и давайте сразу еще одну):

QLabel *imageLabel;

QScrollArea *scrollArea;

 

2.2. Теперь поработаем с конструктором:

ui->setupUi(this);

imageLabel = new QLabel;

imageLabel->setBackgroundRole(QPalette::Base);

imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

imageLabel->setScaledContents(true);

scrollArea = new QScrollArea;

scrollArea->setBackgroundRole(QPalette::Dark);

scrollArea->setWidget(imageLabel);

setCentralWidget(scrollArea);

//resize(1600, 1066); //если захотите менять размеры

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

Подсказка: QString File_Name =qApp->applicationDirPath()+"/Red_Sky.jpg";

Еще одна подсказка: картинки Вы можете найти в «LabPract/Qt/Pictures».

Бонус: любителям смешных картинок «LabPract/Qt/Pictures/Юмор».

 

2.3. Приложение должно быть красивым: измените заголовок окна на «Самый лучший просмотрщик картинок созданный САПРовцем» (либо на любой другой по вашему усмотрению) и добавте иконку к окошку (предварительно подключив ее в файле ресурсов).

 

2.4. Создайте меню Просмотр, а в нем пункты: Истинный размер, По размеру окна, На весь экран, Предыдущий, Следующий. Придайте им соответствующие иконки, переименуйте действия в action_Real, action_Stretch, action_Full, action_Back и action_Forward соответственно, а также задайте им горячие клавиши: Ctrl+A, Ctrl+B, Ctrl+F, ,®.

Разместите их в панели инструментов.

 

2.5. Работа с панелью инструментов:

переместите панель инструментов вниз – так будет удобнее;

выберите в Инспекторе объектов Панель инструментов либо просто щелкните по ней на форме, в Окне свойств найдите iconSize и установите значения 96 и 48 для ширины и высоты соответственно (либо другие значения – в зависимости от выбранного набора иконок).

 

3. Истинный размер – реализуйте самостоятельно.

 

4. По размеру окна – нажатие на эту кнопку растянет картинку до размеров окна нашего приложения и привяжет к границам окна, при этом возможны искажения картинки, повторное нажатие – отвязывает картинку.

if (scrollArea->widgetResizable())

{

scrollArea->setWidgetResizable(false);

menuBar()->show();

ui->mainToolBar->show();

}

else

{

scrollArea->setWidgetResizable(true);

menuBar()->hide();

// ui->mainToolBar->hide();

}

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

 

5. На весь экран:

if (this->isFullScreen())

{

if ( _maximized ) this->showMaximized();

else this->showNormal();

menuBar()->show();

}

else

{

_maximized = this->isMaximized();

this->showFullScreen();

menuBar()->hide();

}

Тут следуете описать одну переменную, но Вы, я думаю, догадываетесь где и как… ;-)

 

Это интересно:действия По размеру окна и На весь экран очень занятно комбинируются – проверьте.

 

6. Туда и обратно.

Попробуем научиться перемещатся по каталогам с картинками – для этого напишем обработчики соответствующих событий и еще одну

void MainWindow::on_action_Back_triggered()

{

if (current_index_ - 1 >= 0)

{

--current_index_;

imageLabel->setPixmap(list_[current_index_].filePath());

}

}

void MainWindow::on_action_Forward_triggered()

{

if (current_index_ + 1 < list_.count())

{

++current_index_;

imageLabel->setPixmap(list_[current_index_].filePath());

}

}

Как видно следует добавить парочку переменных (в заголовочный файл):

int current_index_;

QFileInfoList list_;

Возникает закономерный вопрос, где определить эти переменные?

Для того чтобы изваять список с картинками, нужна следующая процедура:

QFileInfoList MainWindow::getListFiles(QString dirPath) const

{

QDir dir(dirPath);

QStringList filters;

filters << "*.jpg" << "*.jpeg" << "*.png" << ".bmp" << "tiff" << "ico";

dir.setNameFilters(filters);

return dir.entryInfoList(filters, QDir::Files);

}

Не забудем ее описать в классе:

QFileInfoList getListFiles(QString dirPath) const;

А вызывать ее надо после диалога открытия файла:

last_open_dir = File_Name.left(File_Name.lastIndexOf('/'));

list_ = getListFiles(last_open_dir);

current_index_ = list_.indexOf(QFileInfo(File_Name));

Напомню, что изначально кнопки «вперед-назад» должны быть неактивны.

 

7. Работа с принтером.

void MainWindow::print()

{

Q_ASSERT(imageLabel->pixmap());

#if !defined(QT_NO_PRINTER) && !defined(QT_NO_PRINTDIALOG)

QPrintDialog dialog(&printer, this);

if (dialog.exec()) {

QPainter painter(&printer);

QRect rect = painter.viewport();

QSize size = imageLabel->pixmap()->size();

size.scale(rect.size(), Qt::KeepAspectRatio);

painter.setViewport(rect.x(), rect.y(), size.width(), size.height());

painter.setWindow(imageLabel->pixmap()->rect());

painter.drawPixmap(0, 0, *imageLabel->pixmap());

}

#endif

}

Подключите необходимые библиотеки.

 

8. Больше-меньше.

Добавьте лупы ( ) на экран для увеличения и уменьшения размеров картинки. Реализуйте реакцию на нажатие этих кнопок.

В этом вам поможет:

void MainWindow::scaleImage(double factor)

{

Q_ASSERT(imageLabel->pixmap());

scaleFactor *= factor;

imageLabel->resize(scaleFactor * imageLabel->pixmap()->size());

 

adjustScrollBar(scrollArea->horizontalScrollBar(), factor);

adjustScrollBar(scrollArea->verticalScrollBar(), factor);

 

zoomInAct->setEnabled(scaleFactor < 3.0);

zoomOutAct->setEnabled(scaleFactor > 0.333);

}

Опишите в классе новые переменные.

 



<== предыдущая лекция | следующая лекция ==>
Самостоятельная работа (п. 11-12). | Теоретическое введение


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.302 сек.