Тема: «Главные окна. Меню. Работа с файлами»

Пример 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) и путь к этому файлу (оставьте установленный по умолчанию путь к папке Вышего проекта). Нажмите кнопу <Next>.

В следующем окне нажмите <Finish>.

Появится окно редактирования файла ресурсов. Расширение имени файла ресурсов — qrc, поэтому в заголовке окна должно быть указано res.qrc.

Нажмите кнопку < Add> в этом окне и в выпадающем меню - < Add Prefix >.

Обычно в качестве префикса используют Slash (/). Задайте Prefix как пока­зано на рисунке.

Щелкните опять по кнопке Add и выберите Add Files. В появившемя окне выделите имена файлов-рисунков (*.png) и щелкните по кнопке <Open>. Имена файлов должны появиться в окне для работы с ресурсами. Сохраните файл ресурсов (Ctrl+s) и закройте окно ресурсов (Ctrl+w).

Вернитесь к проектированию окна программы.

Окно типа QMainWindow содержит вверху полоску меню и на ней заготовку кнопки с надписью Type Here. Сделайте двойной щелчок мышью по этой кнопке и напишите имя команды: Файл. Нажмите <Enter>. Появится заготовка выпадающе­го меню.

В выпадающем меню сделайте двойной щелчок по заготовке кнопки с надписью Type Here, напишите: Открыть файл и нажмите <Enter>. После этого сделайте двойной щелчок по расположенной ни­же кнопке <Add Separator>, в результате будет добавлен раз­делитель между кнопками вы­падающего меню.

В свойствах созданной кнопки (справа) задайте свойство objectName: actionOpen (команды выпадающе­го меню называются actions (действия)).

Сделайте двойной щелчок по следующей заготовке кнопки (по надписи Type Here) и задайте название команды: Выход и идентификатор objectName: actionQuit.

Под проектом окна программы располагается окно со вкладкой Action Editor. Перейдите на эту вкладку. Вы увидите список созданных действий.

Сделайте двойной щелчок по строке аctionOpen. Откроется окно редактиро­вания свойств соответствующей кнопки. В этом окне в строке Icon: щелкните по кнопке с тремя точками.

 

Откроется окно Select Resource. Щелкните по строке <resource root>, должны появиться значки.

Выберите нужный значок для команды ищелкните по кнопке <OK>.

В текущем окне выделите окно с надписью Shortcut и нажмите комбинацию клавиш, которая будет активизировать команду (например Ctrl + О) (буква латинская). Название «горячих клавиш» автоматически отобразится в этом окне и будет отображаться рядом с названием команды меню во время выполнения программы. Для того, чтобы убрать «горячую клавишу» используйте расположенную справа кнопку с красной стрелочкой.

Нажмите <OK>.

Проделайте те же действия для строки actionQuit. Установите клавишу <Esc> для вызова команды «Выход». Нажмите <OK>.

Теперь для каждой команды будет установлен значок.

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

Накройте рабочую поверхность окна элементом text Edit, с его помощью мы будем отображать текст файла.

Теперь проект окна дол­жен иметь вид как на рисунке.

Перейдите в окно, располагающееся под проектом окна программы на вкла­дку «Signals & Slots Editor». Добавьте новую связь, щелкнув по зеленому крестику.

Свяжите сигнал triggered() (вызвана) кнопки с идентификатором actionQuit со слотом close() для главного окна.

 

Отредактируйте файл main.cpp как показано на рисунке.

#include <QtGui/QApplication>

#include "mainwindow.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MainWindow w;

w.move(400,200); // перемещаем окно по экрану

w.show();

return a.exec();

}

Запустите приложение и проверьте работу команды «Выход» (в том числе и клавишу <Esc>).

Вернитесь к проектированию окна программы.

В окне редактирования команд меню перейдите на вкладку Action Editor.

Щелкните правой кнопкой мыши по команде actionOpen и в контекстном меню выберите Go to slot. Создайте слот для сигнала triggered().

В начало файла mainwindow.cpp добавьте команды:

#include <QFile>

#include <QTextCodec>

Отредактируйте текст слота как показано ниже.

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. Выберите каталог, в котором содержится исполняемый файл Вашей программы (он будет открываться первым), и нажмите кнопку <Next>. На следую­щем шаге нажмите <Finish>.

В появившемся окне напишите 3-4 строчки текста и сохраните файл.

Наша первая программа будет работать с одним конкретным файлом. Чтобы не указывать полный путь к файлу, можно включить его в ресурсы программы. В окне, отображающем структуру проекта, в разделе Resources сделайте двойной щелчок по имени файла ресурсов (res.qrc) и добавьте файл в ресурсы с помощью кнопки Add. Сохраните файл ресурсов и запустите программу. Откройте файл и убедитесь, что текст файла отображается в окне.

 

Пример 2: программа, которая считывает текст из файла и поло­вину строк переписывает в другой файл; используются специаль­ные окна для работы с файлами.

Создайте проект на основе класса QMainWindow, добавьте меню с команда­ми «Открыть файл», «Сохранить файл» и «Выход». Свяжите сигнал triggered() кнопки «Выход» со слотом close() главного окна (см. пример 1).

Объявите в классе MainWindow файл и счетчик строк:

QFile file;

int counter;

В начало файла mainwindow.h вставьте подключение заголовочного файла:

#include <QFile>

Перейдите в файл mainwindow.cpp и подключите заголовочные файлы:

#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()) // если имя файла выбрано

{

   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 <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("Файл не сохранен");

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: