Класс формы добавления записей



Внешний вид окна формы представлен на рисунке 6, а . Для реализации формы необходимо создать интерфейсный класс addForm, который должен включать виджеты кнопок, меток и элементов ввода (рисунок 6, б), а также предусматривать обработку нажатия кнопок Добавить и Назад.

Рисунок 6 – Внешний вид (а) и диаграмма класса (б) окна добавления записей

Объявление класса поместим в файл addForm.h:

 

#ifndef addForm_h

#define addForm_h

#include <QtGui>

class addForm : public QWidget

{   

Q_OBJECT

QLabel * family,* name,* nomer;

QLineEdit * familyEdit,* nameEdit,* nomerEdit;

QPushButton * btnAdd, * btnExit;

public:

addForm();

public slots:

void addRecord();

};

#endif

 

Реализацию методов соответственно помещаем в файл addForm.cpp:

 

#include "addForm.h"

#include "bookFile.h"

#include "mainForm.h"

addForm::addForm()

{

QTextCodec *codec =

   QTextCodec::codecForName("Windows-1251");

this->setWindowTitle(RUS("Добавление записей"));

QVBoxLayout *layoutV1 = new QVBoxLayout();

family=new QLabel(RUS("Фамилия"), this);

name=new QLabel(RUS("Имя"), this);

nomer=new QLabel(RUS("Телефон"), this);

layoutV1->addWidget(family); 

layoutV1->addWidget(name);

layoutV1->addWidget(nomer);

QVBoxLayout *layoutV2 = new QVBoxLayout();

familyEdit=new QLineEdit(RUS(""), this);

nameEdit=new QLineEdit(RUS(""), this);

nomerEdit=new QLineEdit(RUS(""), this);

layoutV2->addWidget(familyEdit); 

layoutV2->addWidget(nameEdit);

layoutV2->addWidget(nomerEdit);

QHBoxLayout *layoutG1 = new QHBoxLayout();

layoutG1->addLayout(layoutV1);

layoutG1->addLayout(layoutV2);

QHBoxLayout *layoutG2 = new QHBoxLayout();

btnAdd=new QPushButton(RUS("Добавить"), this);

btnExit=new QPushButton(RUS("Назад"),this);

layoutG2->addWidget(btnAdd);

  layoutG2->addWidget(btnExit);

QVBoxLayout *layout = new QVBoxLayout(this);

layout->addLayout(layoutG1);

layout->addLayout(layoutG2);

connect(btnAdd, SIGNAL(clicked(bool)),

       this,SLOT(addRecord()));

connect(btnExit, SIGNAL(clicked(bool)),

       this,SLOT(close()));

}

void addForm::addRecord()

{

bookFile book;

recType r;

r.fam=familyEdit->text();

r.name=nameEdit->text();

r.nom=nomerEdit->text();

familyEdit->clear();

nameEdit->clear();

nomerEdit->clear();

book.addRec(r);

}

Класс формы вывода записей на экран. Создание таблицы

При создании интерфейсовдостаточно часто возникает необходимость вывода на экран табличных данных. Библиотека Qt с этой целью предоставляет специальный класс QTableWidget. Объект этого класса – таблица, каждая ячейка которой – объект класса QTableWidgetItem (рисунок 7).

Рисунок 7 – Внешний вид (а) и диаграмма классов (б) формы вывода записей на экран

Оба класса предлагают большое количество методов, позволяющих создавать на экране таблицы с текстовой и графической информацией, а также выводить и вводить из них данные [2]. В рассматриваемом примере таблица используется только для вывода результатов, поэтому объекты класса ячейки создаются с флагами Qt::NoItemFlags, запрещающими не только изменение, но и выделение ячеек.

Описание класса помещаем в файл printForm.h:

#ifndef printForm_h

#define printForm_h

#include "bookFile.h"

#include <QtGui>

class printForm : public QWidget

{   

QTextCodec *codec;

QTableWidget *table; // указатель на класс таблицы

QPushButton *btnExit;

void showRow(int i,recType r);// вывод строки таблицы

public:

printForm(); // конструктор

void showAll(); // показать все записи

void showResults(recType r1); // показать результаты поиска

};

#endif

 

Реализацию методов помещаем в файл printForm.cpp:

 

#include "printForm.h"

#include "mainForm.h"

printForm::printForm()

{

codec = QTextCodec::codecForName("Windows-1251");

this->setWindowTitle(RUS("Результат"));

   QStringList strlist; // объект Список строк

strlist << RUS("Фамилия")<< RUS("Имя")

        << RUS("Телефон"); // записываем строки заголовка

table = new QTableWidget(10,3,this); // создаем таблицу

table->setHorizontalHeaderLabels(strlist);// включаем

                                                                                              // заголовок

QHBoxLayout *layoutG2 = new QHBoxLayout();

btnExit=new QPushButton(RUS("Назад"), this);

  layoutG2->addWidget(btnExit);

QVBoxLayout *layout = new QVBoxLayout(this);

layout->addWidget(table);

layout->addLayout(layoutG2);

connect(btnExit, SIGNAL(clicked(bool)),

        this,SLOT(close()));

}

void printForm::showRow(int i,recType r)

{

QTableWidgetItem *item; // элемент таблицы

item = new QTableWidgetItem(); // создаем элемент

item->setFlags(Qt::NoItemFlags);//запрещаем

                                                                                    // выделение

item->setText(r.fam);   // записываем текст

table->setItem(i,0,item);// привязываем элемент

                                                                    // к таблице

item = new QTableWidgetItem();// создаем элемент

item->setFlags(Qt::NoItemFlags); //запрещаем

                                                                                    // выделение

item->setText(r.name);

table->setItem(i,1,item); // привязываем элемент

item = new QTableWidgetItem();// создаем элемент

item->setFlags(Qt::NoItemFlags); //запрещаем

                                                                                    // выделение

item->setText(r.nom); // записываем текст

table->setItem(i,2,item); // привязываем элемент

}

void printForm::showAll()

{

bookFile book;

if (!book.readRec())

{ // если файл пустой , то создаем сообщение

    QMessageBox msg(QMessageBox::Critical,

           RUS("Нет данных"),

           RUS("База пуста"),

           QMessageBox::Ok,0);

    msg.exec(); // выводим сообщение

}

else

{ // иначе - выводим таблицу по строкам

    showRow(0,book.r);

int i=0;

while (book.readRec())

    showRow(++i,book.r);

table->setRowCount(i+1);

resize(350,330);

show();

}

}

void printForm::showResults(recType r1)

{

bookFile book;

book.reset();

if (!book.findFirst(r1))

{ // если данные не найдены, то создаем сообщение

    QMessageBox msg(QMessageBox::Critical,

         RUS("Нет данных"),

         RUS("Данные не найдены"),

         QMessageBox::Ok,0);

    msg.exec();

}

else

{ // иначе - выводим результаты  по строкам

    showRow(0,book.r);

int i=0;

while (book.findNext(r1))

    showRow(++i,book.r);

table->setRowCount(i+1);

resize(350,200);

show();

}

}

Класс формы поиска

По структуре форма поиска аналогична форме ввода, поэтому их классы имеют одинаковую структуру (рисунок 8).

Рисунок 8 – Внешний вид и диаграмма классов формы поиска

Описание класса поместим в файл findForm.h:

 

#ifndef findForm_h

#define findForm_h

#include <QtGui>

#include "printForm.h"

class findForm : public QWidget

{   

Q_OBJECT

QLabel * family,* name;

QLineEdit * familyEdit,* nameEdit;

QPushButton * btnFind, * btnExit;

printForm winPrint;

public:

findForm();   // конструктор

public slots:

void findRecs(); // метод поиска записей

};

#endif

 

Реализацию методов помещаем в файл findForm.сpp:

 

#include "findForm.h"

#include "bookFile.h"

findForm::findForm()

{

QTextCodec *codec =

    QTextCodec::codecForName("Windows-1251");

this->setWindowTitle(RUS("Поиск записей"));

QVBoxLayout *layoutV1 = new QVBoxLayout();

family=new QLabel(RUS("Фамилия"), this);

name=new QLabel(RUS("Имя"), this);

layoutV1->addWidget(family); 

layoutV1->addWidget(name);

QVBoxLayout *layoutV2 = new QVBoxLayout();

familyEdit=new QLineEdit(RUS(""), this);

nameEdit=new QLineEdit(RUS(""), this);

layoutV2->addWidget(familyEdit); 

layoutV2->addWidget(nameEdit);

QHBoxLayout *layoutG1 = new QHBoxLayout();

layoutG1->addLayout(layoutV1);

layoutG1->addLayout(layoutV2);

QHBoxLayout *layoutG2 = new QHBoxLayout();

btnFind=new QPushButton(RUS("Найти"), this);

btnExit=new QPushButton(RUS("Назад"), this);

layoutG2->addWidget(btnFind);

  layoutG2->addWidget(btnExit);

QVBoxLayout *layout = new QVBoxLayout(this);

layout->addLayout(layoutG1);

layout->addLayout(layoutG2);

connect(btnFind, SIGNAL(clicked(bool)),

         this,SLOT(findRecs()));

connect(btnExit, SIGNAL(clicked(bool)),

            this,SLOT(close()));

}

void findForm::findRecs()

{

recType r; // параметры поиска

r.fam=familyEdit->text();

r.name=nameEdit->text();

winPrint.showResults(r);

}

Основная программа

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

#include "mainForm.h"

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

{

QApplication appl(argc,argv);// создать приложение

Window win;  // создать Главное окно

win.show(); // показать на экране Главное окно

return appl.exec(); // запуск цикла обработки сообщений

}

Литература

1. Г.С. Иванова. Программирование: Учеб. для вузов. – М.: Из-во Кнорус, 2013.

2. М.Шлее Qt 4.5/ Профессиональное программирование на С++. – СПб.: БХВ-Петербург, 2010.

 


Дата добавления: 2018-04-04; просмотров: 568; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!