|
QT ортасы. Qt ортасында бағдарламалау зертханалық жұмыстар. Лабораторная работа 3 20 Тема Ипользование вспомогательных функций и вывод нескольких чисел c помощью одного элемента управления 20
Тема: «Главные окна. Меню. Работа с файлами» Пример 1: программа, которая считывает текст из файла и выводит его в главном окне; используется файл ресурсов. Создайте проект на базе класса QMainWindow.
В этой программе мы будем использовать команды меню «Открыть файл» и «Выход» и соответствующие иконки на панели инструментов. Используя команду операционной системы «Search for Files>, найдите файлы fileopen.png и exit.png. Скопируйте эти файлы в папку проекта.
Графические изображения и другие ресурсы лучше хранить в самом исполняемом файле программы.
Для подключения файлов к ресурсам программы вернитесь в Qt Creator и выберите в меню File | New File or Project. Нам нужно создать файл ресурсов. Для этого выберите в появившемся окне Qt | Qt Resource file и нажмите Choose.
В появившемся окне Choose the Location нужно задать имя файла ресурсов (например res) и путь к этому файлу (оставьте установленный по умолчанию путь к папке Вышего проекта). Нажмите кнопу .
В следующем окне нажмите .
Появится окно редактирования файла ресурсов. Расширение имени файла ресурсов — qrc, поэтому в заголовке окна должно быть указано res.qrc.
Нажмите кнопку <Add> в этом окне и в выпадающем меню - <Add Prefix>.
Обычно в качестве префикса используют Slash (/). Задайте Prefix как показано на рисунке.
Щелкните опять по кнопке Add и выберите Add Files. В появившемя окне выделите имена файлов-рисунков (*.png) и щелкните по кнопке . Имена файлов должны появиться в окне для работы с ресурсами. Сохраните файл ресурсов (Ctrl+s) и закройте окно ресурсов (Ctrl+w).
Вернитесь к проектированию окна программы.
Окно типа QMainWindow содержит вверху полоску меню и на ней заготовку кнопки с надписью Type Here. Сделайте двойной щелчок мышью по этой кнопке и напишите имя команды: Файл. Нажмите . Появится заготовка выпадающего меню.
В выпадающем меню сделайте двойной щелчок по заготовке кнопки с надписью Type Here, напишите: Открыть файл и нажмите . После этого сделайте двойной щелчок по расположенной ниже кнопке , в результате будет добавлен разделитель между кнопками выпадающего меню.
В свойствах созданной кнопки (справа) задайте свойство objectName: actionOpen (команды выпадающего меню называются actions (действия)).
Сделайте двойной щелчок по следующей заготовке кнопки (по надписи Type Here) и задайте название команды: Выход и идентификатор objectName: actionQuit.
Под проектом окна программы располагается окно со вкладкой Action Editor. Перейдите на эту вкладку. Вы увидите список созданных действий.
Сделайте двойной щелчок по строке аctionOpen. Откроется окно редактирования свойств соответствующей кнопки. В этом окне в строке Icon: щелкните по кнопке с тремя точками.
Откроется окно Select Resource. Щелкните по строке , должны появиться значки.
Выберите нужный значок для команды ищелкните по кнопке .
В текущем окне выделите окно с надписью Shortcut и нажмите комбинацию клавиш, которая будет активизировать команду (например Ctrl + О) (буква латинская). Название «горячих клавиш» автоматически отобразится в этом окне и будет отображаться рядом с названием команды меню во время выполнения программы. Для того, чтобы убрать «горячую клавишу» используйте расположенную справа кнопку с красной стрелочкой.
Нажмите .
Проделайте те же действия для строки actionQuit. Установите клавишу для вызова команды «Выход». Нажмите .
Теперь для каждой команды будет установлен значок.
Перетащите мышью значки команд из окна Action Editor в заготовку окна программы на полоску панели инструментов, располагающуюся под меню.
Накройте рабочую поверхность окна элементом text Edit, с его помощью мы будем отображать текст файла.
Т еперь проект окна должен иметь вид как на рисунке.
Перейдите в окно, располагающееся под проектом окна программы на вкладку «Signals & Slots Editor». Добавьте новую связь, щелкнув по зеленому крестику.
Свяжите сигнал triggered() (вызвана) кнопки с идентификатором actionQuit со слотом close() для главного окна.
Отредактируйте файл main.cpp как показано на рисунке.
#include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.move(400,200); // перемещаем окно по экрану w.show(); return a.exec(); }
Запустите приложение и проверьте работу команды «Выход» (в том числе и клавишу ).
Вернитесь к проектированию окна программы.
В окне редактирования команд меню перейдите на вкладку Action Editor.
Щелкните правой кнопкой мыши по команде actionOpen и в контекстном меню выберите Go to slot. Создайте слот для сигнала triggered().
В начало файла mainwindow.cpp добавьте команды:
#include #include
Отредактируйте текст слота как показано ниже.
void MainWindow::on_actionOpen_triggered() { QTextCodec* codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForCStrings(codec); QFile file(":/test.txt"); /* объявляем файл, файл мы будем брать из ресурсов программы (на это указывает префикс « :/ » в имени файла */ if (file.exists()) // если файл найден { file.open(QIODevice::ReadOnly|QIODevice::Text); // открываем его QString text = file.readAll(); // считываем весь текст ui->textEdit->setText(text); // выводим текст файла на экран } else ui->textEdit->setText("Файл не найден"); }
Создайте текстовый файл для проверки работы программы. Для этого в окне Qt Creator вызовите команду File | New File or Project. В появившемся окне выберите General | Text File и нажмите кнопку Choose. На следующем шаге задайте имя файла test. Выберите каталог, в котором содержится исполняемый файл Вашей программы (он будет открываться первым), и нажмите кнопку . На следующем шаге нажмите .
В появившемся окне напишите 3-4 строчки текста и сохраните файл.
Наша первая программа будет работать с одним конкретным файлом. Чтобы не указывать полный путь к файлу, можно включить его в ресурсы программы. В окне, отображающем структуру проекта, в разделе Resources сделайте двойной щелчок по имени файла ресурсов (res.qrc) и добавьте файл в ресурсы с помощью кнопки Add. Сохраните файл ресурсов и запустите программу. Откройте файл и убедитесь, что текст файла отображается в окне.
Пример 2: программа, которая считывает текст из файла и половину строк переписывает в другой файл; используются специальные окна для работы с файлами. Создайте проект на основе класса QMainWindow, добавьте меню с командами «Открыть файл», «Сохранить файл» и «Выход». Свяжите сигнал triggered() кнопки «Выход» со слотом close() главного окна (см. пример 1).
Объявите в классе MainWindow файл и счетчик строк:
QFile file; int counter; В начало файла mainwindow.h вставьте подключение заголовочного файла: #include Перейдите в файл mainwindow.cpp и подключите заголовочные файлы: #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include В конструкторе задайте кодировку, обеспечивающую использование кириллицы: 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()) // если имя файла выбрано { file.setFileName(fileName); // связываем объект file с физическим файлом file.open(QIODevice::ReadOnly|QIODevice::Text); // открываем файл для чтения QString text = "Файл " + fileName + ": \n"; // выводим название файла QString line; // строка для чтения файла counter = 0; while (!file.atEnd()) // пока файл не закончен { line = file.readLine(); // считываем строку из файла counter++; // увеличиваем счетчик строк text += line; // добавляем строку к тексту } QString tmp; // вспомогательная строка для отображения результата tmp = Qstring( "\nКоличество строк в файле %1 \n").arg(counter); text += tmp; // добавляем результат к выводимому тексту ui->textEdit->setText(text); // отображаем текст на экране } }
Создайте слот для команды actionSave:
void MainWindow::on_actionSave_triggered() { QString fileName = QFileDialog::getSaveFileName(this, "Сохранить файл", Qstring(), QString("Текстовые файлы (*.txt);;Все файлы (*.*)") ); // используем окно для задания имени сохраняемого файла QFile rezFile; // Результирующий файл if (!fileName.isEmpty()) // Если имя файла задано { QString line; // строка из файла if (file.isOpen()) // если исходный файл открыт { file.seek(0); // переходим в начало файла rezFile.setFileName(fileName); // присваиваем физическое имя результирующему файлу rezFile.open(QIODevice::WriteOnly|QIODevice::Text); // открываем сохраняемый файл QTextStream out(&rezFile); /* создаем поток, связанный с файлом (запись файла обычно выполняется с помощью потока) */ for (int i = 1; i <= counter/2; ++i) // отсчитываем половину строк { line = file.readLine(); // считываем строку из исходного файла out << line; // записываем в результирующий файл } rezFile.close(); // закрываем создаваемый файл rezFile.open(QIODevice::ReadOnly|QIODevice::Text); // открываем сохраненнный файл для чтения QString text = rezFile.readAll(); // считываем результирующий файл ui->textEdit->setText(text); // выводим полученный файл на экран } } else ui->textEdit->setText("Файл не сохранен"); }
Пример 3: программа, которая считывает текст из файла и подсчитывает количество видимых символов и количество русских букв. Создайте проект на основе класса QMainWindow, добавьте меню с командами «Открыть файл» и «Выход». Свяжите сигнал triggered() кнопки «Выход» со слотом close() главного окна (см. пример 1).
Подключите заголовочные файлы: #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include Добавьте команды, обеспечивающие использование кириллицы: 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). Задайте свойства как показано на рисунке.
Подключите иконку к кнопке.
Нажмите .
Перетащите иконку нового действия на панель инструментов. Теперь в меню должно быть 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. Кнопка нужна обязательно, мы будем проверять, была ли она нажата. Нажмите .
В следующем окне нужно задать имя класса, который будет описывать диалоговое окно, и имена файлов, которые будут содержать описание класса. Оставьте предложенные имена и нажмите .
Спроектируйте окно как показано на рисунке. Для ввода последовательностей символов используйте элементы 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) // выводим окно на экран и если была нажата кнопка { 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("Файл не сохранен"); }
Задания для самостоятельного выполнения
Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, выравнивая длину каждой строки до заданной. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов.
Длину строки считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов.
Написать программу с окном типа QMainWindow, которое считывает текст из файла, выводит его на экран и подсчитывает, сколько раз заданный символ содержится в тексте. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Символ считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла, выводит его на экран и подсчитывает, сколько раз заданное слово содержится в тексте. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов.
Слово считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов.
Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран первые n символов этого файла. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Количество символов считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран первые n слов этого файла. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Количество слов считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран первые n строк этого файла. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Количество строк считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран первые n символов каждой строки. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Количество символов считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран те строки, которые начинаются с заданной последовательности символов. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Символы считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран первые n слов каждой строки. Если в строке меньше слов, то выводится вся строка. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Количество слов считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран те строки, которые заканчиваются заданной последовательностью символов. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Символы считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран те слова, которые начинаются на заданную последовательность символов. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Символы считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран те слова, которые содержат заданную последовательность символов. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Символы считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран те слова, которые заканчиваются заданной последовательностью символов. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Символы считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем выводит на экран те слова, длина которых равна заданной. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Длину слов считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем повторно выводит на экран текст из файла, вставляя после заданного символа пробел, если он еще не стоит там. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Символ считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов. Написать программу с окном типа QMainWindow, которое считывает текст из файла и выводит его на экран, затем повторно выводит его на экран, удаляя перед заданным символом пробелы, если они стоят там. Имя файла должно считываться с помощью специального диалогового окна для открытия файлов. Символ считывать с помощью вспомогательного диалогового окна, которое выводится на экран при нажатии на кнопку на панели инструментов.
Лабораторная работа № 6 |
|
|