Класс формы добавления записей
Внешний вид окна формы представлен на рисунке 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!