
- •Содержание
- •Лабораторная работа № 1
- •Тема: «Знакомство со средой Qt creator. Простые диалоговые приложения»
- •Пример 1: Программа, вычисляющая вещественный остаток от деления двух вещественных чисел
- •Пример 2: Программа, которая находит квадратный корень числа.
- •Пример 3: Программа, которая иллюстрирует использование стандартных сигналов и слотов.
- •Пример 4: Программа, которая вычисляет значение арифметического выражения
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 2
- •Тема: «Отладка программы»
- •Пошаговое выполнение программы
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 3
- •Тема: «Ипользование вспомогательных функций и вывод нескольких чисел c помощью одного элемента управления»
- •Пример 1: программа, которая находит заданное количество совершенных чисел, и выводит их на экран с помощью элемента textEdit
- •Пример 2: программа, которая выводит значения функции на заданном отрезке с помощью списка listWidget
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 4
- •Тема: «Работа со строками»
- •Пример 1: программа, которая переводит число из 16-ой системы в 10-ую. При вводе выполняется проверка вводимых символов.
- •Пример 2: программа, которая считывает строку символов, состоящую из русских букв, запятых и пробелов и выводит на экран множество символов этой строки.
- •Пример 3: программа, которая считывает текст из элемента tetxEdit и выводит в столбик числа, содержащиеся в тексте с помощью другого элемента типа textEdit.
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 5
- •Тема: «Главные окна. Меню. Работа с файлами»
- •Пример 1: программа, которая считывает текст из файла и выводит его в главном окне; используется файл ресурсов.
- •Пример 2: программа, которая считывает текст из файла и половину строк переписывает в другой файл; используются специальные окна для работы с файлами.
- •Пример 3: программа, которая считывает текст из файла и подсчитывает количество видимых символов и количество русских букв.
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 6
- •Тема: «Графические элементы и строки состояния»
- •Пример 2: программа, в которой используется область отсечения qRegion и котекстное меню для выбора способа заливки этой области.
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 7
- •Пример 1: программа, которая рисует траектории движения мыши при нажатой левой кнопке выбранным цветом и стирает рисунок при щелчке правой кнопкой мыши.
- •Пример 2: программа, которая рисует окружности с помощью мыши (окружность видима в процессе построения). Нарисованные окружности можно сохранить в файле и загрузить из файла.
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 8
- •Тема: «Области отсечения»
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 9
- •Тема: «Работа с массивами с помощью класса qVector»
- •Задания для самостоятельного выполнения
Пример 3: программа, которая считывает текст из файла и подсчитывает количество видимых символов и количество русских букв.
Создайте проект на основе класса QMainWindow, добавьте меню с командами «Открыть файл» и «Выход». Свяжите сигнал triggered() кнопки «Выход» со слотом close() главного окна (см. пример 1).
Подключите заголовочные файлы:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileDialog> #include <QTextCodec> #include <QTextStream> Добавьте команды, обеспечивающие использование кириллицы: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QTextCodec* codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForCStrings(codec); } MainWindow::~MainWindow() { delete ui; }
Создайте слот для команды actionOpen:
void MainWindow::on_actionOpen_triggered() { QString fileName = QFileDialog::getOpenFileName(this, "Открыть файл", Qstring(), QString("Текстовые файлы (*.txt);;Все файлы (*.*)") ); // выбираем файл для чтения if (!fileName.isEmpty()) // если имя файла выбрано { QFile file; file.setFileName(fileName); // связываем объект file с физическим файлом file.open(QIODevice::ReadOnly|QIODevice::Text); // открываем файл для чтения QFileInfo fi(fileName); // объект, который хранит информацию о файле QString name = fi.fileName(); // получаем чистое имя файла (без пути) QString text; // здесь будет храниться текст файла QChar sym; // один символ из файла QTextStream in(&file); // поток для чтения файла int counter = 0; // счетчик символов while (!in.atEnd()) // пока поток не закончен { in >> sym; // считываем символ if (sym.isPrint()) counter++; /* если это видимый (печатный) символ, увеличиваем счетчик (пробелы относятся к печатным символам) */ text += sym; // добавляем символ к тексту } QString tmp1 = QString("Количество видимых символов = %1 \n").arg(counter); // строка для вывода количества символов counter = text.count(QRegExp("[А-Яа-я]")); // подсчитываем количество русских букв QString tmp2 = QString("Количество русских букв = %1\n").arg(counter); // строка для вывода количества русских букв text += tmp1; text += tmp2; text = "Файл " + name + ": \n\n" + text; // заголовок ui->textEdit->setText(text); // вывод результата } }
Создайте текстовый файл для проверки работы программы (см. пример 1).
Запустите программу и проверьте ее работу.
Пример 4: программа, которая считывает текст из файла и переписывает в другой файл строки, заменяя одну последовательность символов на другую; cимволы задают с помощью специального диалогового окна, появляющегося при нажатии кнопки на панели инструментов.
Создайте проект на основе класса QMainWindow, добавьте меню с командами «Открыть файл», «Сохранить файл» и «Выход». Свяжите сигнал triggered() кнопки «Выход» со слотом close() главного окна (см. пример 1). Подключите иконки к действиям и создайте три кнопки на панели инструментам, соответствующие командам меню.
Найдите файл с какой-нибудь иконкой (*.png), которую Вы будете использовать для кнопки, при нажатии на которую будет появляться диалоговое окно. Скопируйте этот файл в папку Вашего проекта и добавьте его в ресурсы.
В качестве примера создадим кнопку «Задание», которая будет присутствовать только на панели инструментов, не имея аналога в меню.
В окне Action Editor н ажмите кнопку New.
Откроется окно для задания свойств нового действия (action). Задайте свойства как показано на рисунке.
Подключите иконку к кнопке.
Нажмите <OK>.
Перетащите иконку нового действия на панель инструментов. Теперь в меню должно быть 3 команды, а на панели инструментов - 4.
Накройте рабочую поверхность окна элементом textEdit.
Добавьте слот для кнопки «Открыть файл» и внесите в него код как показано ниже:
void MainWindow::on_actionOpen_triggered() { QString fileName = QFileDialog::getOpenFileName(this, "Открыть файл", Qstring(), QString("Текстовые файлы (*.txt);;Все файлы (*.*)" )); // получаем имя файла QFile file; // объявляем объект для работы с файлом if (!fileName.isEmpty()) // если имя файла выбрано { file.setFileName(fileName); // связываем объект с физическим файлом file.open(QIODevice::ReadOnly|QIODevice::Text); // открываем файл QFileInfo fi(fileName); // объект, содержащий информацию о файле QString name = fi.fileName(); // получаем чистое имя файла ui->textEdit->setText( "Файл " + name + ": \n"); // выводим заголовок text = file.readAll(); // считываем текст файла ui->textEdit->append(text); // выводим текст файла в окно } }
Теперь добавим новое диалоговое окно (вместе с классом, который его описывает). Для этого выберите в меню Qt Creator команду File|New File or Progect и в появившемся окне выберите Qt | Qt Designer Form Class.
Появится окно, в котором нужно выбрать шаблон диалогового окна. Выберите один из двух шаблонов с кнопками, например: Dialog with Buttons Right. Кнопка <OK> нужна обязательно, мы будем проверять, была ли она нажата. Нажмите <Next>.
В следующем окне нужно задать имя класса, который будет описывать диалоговое окно, и имена файлов, которые будут содержать описание класса. Оставьте предложенные имена и нажмите <Next>.
Спроектируйте окно как показано на рисунке. Для ввода последовательностей символов используйте элементы lineEdit.
Для того, чтобы получить символы, которые будет вводить пользователь в диалоговом окне, нам нужно в классе Dialog, который описывает диалоговое окно, предусмотреть функции, которые будут предоставлять доступ к этим последовательностям символов. В файле dialog.h объявите функции: QString GetOld(); // символы, которые нужно заменить QString GetNew(); // символы, на которые нужно заменить В файле dialog.cpp определим эти функции: QString Dialog::GetOld() { return ui->lineEdit->text(); } QString Dialog::GetNew() { return ui->lineEdit_2->text(); }
В окне Action Editor перейдите к слоту для действия actionTask и внесите в слот код, показанный ниже:
void MainWindow::on_actionTask_triggered() { Dialog dlg; // объект, соответствующий диалоговому окну dlg.move(420,220); // определяем положение окна на экране if(dlg.exec()==QDialog::Accepted) // выводим окно на экран и если была нажата кнопка <OK> { text.replace(dlg.GetOld(), dlg.GetNew()); // заменяем символы ui->textEdit->setText(text); // выводим отредактированный текст на экран } }
В окне Action Editor перейдите к слоту для действия actionSave и внесите в слот код, показанный ниже:
void MainWindow::on_actionSave_triggered() { QString fileName = QFileDialog::getSaveFileName(this, "Сохранить файл", Qstring(), QString("Текстовые файлы (*.txt);;Все файлы (*.*)") ); // определяем имя, под которым нужно сохранить файл QFile rezFile; // объявляем объект, соответствующий новому файлу if (!fileName.isEmpty()) // если имя файла задано { rezFile.setFileName(fileName); // связываем объект и файл rezFile.open(QIODevice::WriteOnly|QIODevice::Text); // открываем файл QTextStream out(&rezFile); // создаем поток для работы с файлом out << text; // переписываем текст в файл rezFile.close(); // обязательно закрываем созданный файл rezFile.open(QIODevice::ReadOnly|QIODevice::Text); // открываем файл для чтения text = rezFile.readAll(); // считываем текст из файла ui->textEdit->setText("Новый файл:\n"); // выводим заголовок ui->textEdit->append(text); // выводим текст нового файла } else ui->textEdit->setText("Файл не сохранен"); }