Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornyy_praktikum_po_programmirovaniyu_v_s...docx
Скачиваний:
0
Добавлен:
11.12.2019
Размер:
130.48 Кб
Скачать
    1. Пример 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).

Запустите программу и проверьте ее работу.

    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("Файл не сохранен");
}
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]