Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

ПРИЛОЖЕНИЕ А

Читайте также:
  1. А) сведения о российской организации по установленной форме (приложение);
  2. Выбор топологии также необходимо производить исходя из существующих условий. Для построения сети используем Приложение Б – Схема проекта квартала.
  3. Другое приложение любви – рождение духа имперской жертвенности.
  4. Карты, схемы (см. приложение 45)
  5. Клиентское приложение
  6. Ключевые пункты рекомендаций и приложение по проведению анестезии, миоплегии и интенсивной терапии пациентам
  7. Методы экспериментального определения пирофорности веществ и склонность веществ и материалов к самовозгоранию - в соответствии с приложением 5 и ГОСТ 12.1.044-89.

Листинг программы

Файл cash.pro:

QT += core guiTARGET = cashTEMPLATE = appSOURCES += main.cpp\ mainwidget.cppHEADERS += mainwidget.hFORMS += mainwidget.ui

____________________________

Файл mainwidget.h:

#ifndef MAINWIDGET_H#define MAINWIDGET_H#include <QWidget>#include <QString>#include <QtGui>#include <QKeyEvent>namespace Ui {class MainWidget;}class Good;//стнадартный класс виджета в Qt. Это он окна создаетclass MainWidget: public QWidget{ Q_OBJECT public: explicit MainWidget(QWidget *parent = 0); ~ MainWidget (); private: Ui::MainWidget *ui; //указатель для будушего масссива с товарами Good *arr; //счетчик размера массива int countFile; //методо поиска void search(Good*obj, int num, QString str); //метод добавления товара в чек void add_to_check(QString code); // функция, которая копирует вся ячейки с одной в другую void all_clone(); //метод удаления из таблицы с чеком по коду товара void delete_singl(QString code); //метод подсчета ИТОГО void ITOGO(); //обработчики событий.public slots: void NameHandler(); void CodeHandler(); private slots: void on_pushButton_add_clicked(); void on_pushButton_add_all_clicked(); void on_pushButton_clear_clicked(); void on_pushButton_clear_all_clicked(); void on_tableWidget_check_itemClicked(QTableWidgetItem *item); void on_tableWidget_itemClicked(QTableWidgetItem *item); void on_pushButton_save_clicked();};//собственный класс. Экземпляр товара в кассе.class Good{//закрытые поля: имя товара, код, цена. Прямой доступ к полям имеют только методы класса. Принцип инкапсуляцииprivate: QString goods_name; QString goods_code; int goods_price;public: //методы соответственно: конструктор по умолчанию, метод получения поля goods_name, метод получения поля goods_code, метод получения поля goods_price, //метод установки поля goods_name, метод установки поля goods_code, метод установки поля goods_price Good(); void setGoodsName(QString obj); void setGoodsCode(QString obj); void setGoodsPrice(int obj); QString getGoodsName(); QString getGoodsCode(); int getGoodsPrice(); Good* search(Good*obj, int num);};#endif // MAINWIDGET_H______________________________

Файл main.cpp:

#include <QtGui/QApplication>#include "mainwidget.h"// запускает класс MainWidget, рисующий окноint main(int argc, char *argv[]){ QApplication a(argc, argv); MainWidget w; w.show(); return a.exec();}_______________________________

Файл mainwidget.cpp:

#include <QTextStream>

#include <QDebug>

 

//конструктор главного окна

MainWidget::MainWidget(QWidget *parent):

QWidget(parent),

ui(new Ui::MainWidget)

{

// создание главного окна

ui->setupUi(this);

//создаем массив товаров. пока на 500.

arr= new Good[500];

// ввод из файла.

//qApp->applicationDirPath() это строка возвращает адресс дирректории экзешника программки

QString path=qApp->applicationDirPath()+"/cash.txt";

//открывает файл по адресу

QFile f(path);

//создание строки. по умолчанию даем текст "Can't read file!" Если не сможем ничего прочитать из файла

//текст не перезапишется и отобразится на экране

QString buf="Can't read file!";

//счетчик реального количества товаров в массиве.

countFile=0;

if(f. open (QIODevice::ReadOnly))// открыть файл только для чтения

{

//создаем текстовы поток. с текстовым поток специально создается для работы

//с текствыми файлами. позволяет работать с ними быстрее за счет разнообразных готовых функции чтения.

QTextStream out(&f);

//пока не конец файла читаем

while (!out.atEnd())

{

//читаем сроку из файла

buf = out.readLine();

//в файле записано через запятую "название,код,цена". с помощью split режем строку на три слова

QStringList list1=buf.split(",");

//дальше вводим в массив товаров наши записи о товаре

arr[countFile].setGoodsName(list1[0]);

arr[countFile].setGoodsCode(list1[1]);

// преобразуем тип QStringList в int, ибо цена в типе int.

//сначала преобразуем в кютэшнй QString, потом встроенным методом в православный int

//и заодно вводим в массив

QString buf2 = list1[2];

arr[countFile].setGoodsPrice(buf2.toInt());

//qDebug это единственный(!) стандартный спопоб хоть как-то отслеживать переменный в процесе отладки

//он пищет все что после << в "3|Вывод приложения".

qDebug()<<arr[countFile].getGoodsName();

//каждый раз когда записываем в массив данные, увеличиваем счетчик ячеек на один

countFile++;

}

}

f. close ();

//заполняем таблицу. задаем количество строк, оно равно количеству товаров

ui->tableWidget->setRowCount(countFile);

//дебаги на всякий случавй

qDebug()<<countFile;

qDebug()<<arr[7].getGoodsName();

//в цикле заполняем таблицу. таблица заполняется построчно, каждую ячейку отдельно

for(int i=0;i<countFile;i++)

{

//для трех ячеек три специальных обьекта таблицы

QTableWidgetItem* item_1 = new QTableWidgetItem;

QTableWidgetItem* item_2 = new QTableWidgetItem;

QTableWidgetItem* item_3 = new QTableWidgetItem;

//вводдим в каждый обьект таблицы данные из массива с товарами

item_1->setText(arr[i].getGoodsName());

item_2->setText(arr[i].getGoodsCode());

//в итем таблицы можно впихнуть только строку, потому мы сначала наш тип int переводим в строку

item_3->setText(QString::number(arr[i].getGoodsPrice()));

qDebug()<<item_2->text();

//а теперь мы заролняем непосредственно строку. setItem(номер строки, номер ячеки, Обьект таблицы с данными)

ui->tableWidget->setItem(i,0,item_1);

ui->tableWidget->setItem(i,1,item_2);

ui->tableWidget->setItem(i,2,item_3);

}

// Связываем с формой ввода данных lineEdit обработчик из скобок SLOT

//который сработает когда случится событие в скобках у SIGNAL. В нашем случае

//форма ввода с именем lineEdit_code будет обработана функцией CodeHandler() когда случится событие returnPressed(),

//это нажатие на кнопку ENTER

QObject::connect(ui->lineEdit_code, SIGNAL(returnPressed()), this, SLOT(CodeHandler()));

//для второй аналогично

QObject::connect(ui->lineEdit_name, SIGNAL(returnPressed()), this, SLOT(NameHandler()));

}

//дестркутор программы. чистит память от всех данных программы и закрывает ее нахер.

MainWidget::~ MainWidget ()

{

delete ui;

}

//методы нашего класса

//констурктор без параметров, он же конструктор по умолчанию. Конструктор всегда срабатывает при создании экземпляра класса. Может быть пустым. В нашем случае мы задаем значения

//полям по умолчанию.

Good::Good()

{

goods_name="not establish";

goods_code="not establish";

goods_price=-1;

}

//методы для установки и полчуения полей. Те что начинаются на get - устанавливают поле, те что начинаются set - читают поле и возвращают его.

QString Good::getGoodsName()

{

return goods_name;

}

QString Good::getGoodsCode()

{

return goods_code;

}

int Good::getGoodsPrice()

{

return goods_price;

}

void Good::setGoodsCode(QString obj)

{

goods_code=obj;

}

void Good::setGoodsName(QString obj)

{

goods_name=obj;

}

void Good::setGoodsPrice(int obj)

{

goods_price=obj;

}

//поиск по массиву и обновление таблицыб когда произошло событие нажатия на интер,

//мы вызваем этот поиск и ищем в массиве совподающие значения. если совпали - выводим на экран

//содержит три входных параметра: указатель на массив, номер по какому полю искать, и с чем сравнивать.

void MainWidget::search(Good*arr, int num, QString str)

{

qDebug()<<countFile;

//очистили таблицу

ui->tableWidget->removeRow(countFile);

//счетчик для текущего количества записей в таблице

int count=0;

//выбираем по какому полю ищем

switch(num)

{

case 1:

//проходим циклом по всему масссиву и сраниваем

for(int i=0; i<countFile;i++)

{

qDebug()<<ui->lineEdit_code->text();

qDebug()<<arr[0].getGoodsCode();

//если содержит строку - выводим

if(arr[i].getGoodsCode().contains(str))

{

ui->tableWidget->setRowCount(count+1);

QTableWidgetItem* item_1 = new QTableWidgetItem;

QTableWidgetItem* item_2 = new QTableWidgetItem;

QTableWidgetItem* item_3 = new QTableWidgetItem;

item_1->setText(arr[i].getGoodsName());

item_2->setText(arr[i].getGoodsCode());

item_3->setText(QString::number(arr[i].getGoodsPrice()));

qDebug()<<item_2->text();

ui->tableWidget->setItem(count,0,item_1);

ui->tableWidget->setItem(count,1,item_2);

ui->tableWidget->setItem(count,2,item_3);

count++;

}

}

break;

case 2:

qDebug()<<countFile;

qDebug()<<arr[0].getGoodsName();

for(int i=0; i<countFile;i++)

{

if(arr[i].getGoodsName().contains(str))

{

ui->tableWidget->setRowCount(count+1);

QTableWidgetItem* item_1 = new QTableWidgetItem;

QTableWidgetItem* item_2 = new QTableWidgetItem;

QTableWidgetItem* item_3 = new QTableWidgetItem;

item_1->setText(arr[i].getGoodsName());

item_2->setText(arr[i].getGoodsCode());

item_3->setText(QString::number(arr[i].getGoodsPrice()));

qDebug()<<item_2->text();

ui->tableWidget->setItem(count,0,item_1);

ui->tableWidget->setItem(count,1,item_2);

ui->tableWidget->setItem(count,2,item_3);

count++;

}

}

break;

case 3:

for(int i=0; i<countFile;i++)

{

if(QString::number(arr[i].getGoodsPrice()).contains(str))

{

ui->tableWidget->setRowCount(count+1);

QTableWidgetItem* item_1 = new QTableWidgetItem;

QTableWidgetItem* item_2 = new QTableWidgetItem;

QTableWidgetItem* item_3 = new QTableWidgetItem;

item_1->setText(arr[i].getGoodsName());

item_2->setText(arr[i].getGoodsCode());

item_3->setText(QString::number(arr[i].getGoodsPrice()));

qDebug()<<item_2->text();

ui->tableWidget->setItem(count,0,item_1);

ui->tableWidget->setItem(count,1,item_2);

ui->tableWidget->setItem(count,2,item_3);

count++;

}

}

break;

}

}

//обработчики события нажатия на интер. запись вида ui->lineEdit_name->text()

//возвращает нам то, что написано в форме

void MainWidget::NameHandler()

{

qDebug()<<ui->lineEdit_name->text();

search(arr,2,ui->lineEdit_name->text());

}

void MainWidget::CodeHandler()

{

search(arr,1,ui->lineEdit_code->text());

}

void MainWidget::add_to_check(QString code)

{

qDebug()<<ui->tableWidget->rowCount();

qDebug()<<ui->tableWidget->item(1,1)->text();

int check_row_count=ui->tableWidget_check->rowCount();

for(int i=0; i < ui->tableWidget->rowCount(); i++)

{

if(ui->tableWidget->item(i,1)->text()==code)

{

ui->tableWidget_check->setRowCount(check_row_count+1);

ui->tableWidget_check->setItem(check_row_count,0,ui->tableWidget->item(i,0)-> clone ());

ui->tableWidget_check->setItem(check_row_count,1,ui->tableWidget->item(i,1)-> clone ());

ui->tableWidget_check->setItem(check_row_count,2,ui->tableWidget->item(i,2)-> clone ());

}

}

}

void MainWidget::all_clone()

{

int check_row=ui->tableWidget->rowCount();

ui->tableWidget_check->setRowCount(check_row);

for(int i=0; i < check_row; i++)

{

ui->tableWidget_check->setItem(i,0,ui->tableWidget->item(i,0)-> clone ());

ui->tableWidget_check->setItem(i,1,ui->tableWidget->item(i,1)-> clone ());

ui->tableWidget_check->setItem(i,2,ui->tableWidget->item(i,2)-> clone ());

}

}

//нужно очистить удаляемую строку от значений. потом сместить все

//нижнии строки на один выше. а потом уменьшить длинну таблицы на одну строку

void MainWidget::delete_singl(QString code)

{

int check_row_count=ui->tableWidget_check->rowCount();

for(int i=0; i < ui->tableWidget->rowCount(); i++)

{

if(ui->tableWidget->item(i,1)->text()==code)

{

for(int j=i; j<check_row_count-1;j++)

{

ui->tableWidget_check->setItem(j,0,ui->tableWidget_check->item(j+1,0)-> clone ());

ui->tableWidget_check->setItem(j,1,ui->tableWidget_check->item(j+1,1)-> clone ());

ui->tableWidget_check->setItem(j,2,ui->tableWidget_check->item(j+1,2)-> clone ());

}

ui->tableWidget_check->setRowCount(check_row_count-1);

}

}

}

void MainWidget::ITOGO()

{

int sum=0;

for(int i=0; i < ui->tableWidget_check->rowCount(); i++)

{

sum+= ui->tableWidget_check->item(i,2)->text().toInt();

}

QString s = QString::number(sum);

ui->label_total->setText(s);

}

void MainWidget::on_pushButton_add_clicked()

{

add_to_check(ui->lineEdit_code->text());

ITOGO();

}

void MainWidget::on_pushButton_add_all_clicked()

{

all_clone();

ITOGO();

}

void MainWidget::on_pushButton_clear_clicked()

{

qDebug()<<ui->lineEdit_delete->text();

delete_singl(ui->lineEdit_delete->text());

ITOGO();

}

void MainWidget::on_pushButton_clear_all_clicked()

{

// установить количество строк равным 0. и надеятся, что qt очистит память самостоятельно...

ui->tableWidget_check->setRowCount(0);

ui->label_total->setText("0");

}

// функция, которая записывает в строку для удаления код товара по клику

//по ячейке в таблице чека

void MainWidget::on_tableWidget_check_itemClicked(QTableWidgetItem *item)

{

ui->lineEdit_delete->setText(ui->tableWidget_check->item(item->row(),1)->text());

}

// для основоной таблицы с товарами

void MainWidget::on_tableWidget_itemClicked(QTableWidgetItem *item)

{

ui->lineEdit_code->setText(ui->tableWidget->item(item->row(),1)->text());

}

void MainWidget::on_pushButton_save_clicked()

{

QString path=qApp->applicationDirPath()+"/cash_check.txt";

//создаем файл по адресу

QFile f(path);

//создаем строку. по умолчанию даем текст "Can't read file!" Если не сможем ничего порчитать из файла

//текст не перезапишется и отобразится на экране

QString buf="";

//счетчик реального количества товаров в массиве.

countFile=0;

if(f. open (QIODevice::WriteOnly|QIODevice::Text))// открыть только для чтения

{

//создаем текстовы поток. с текстовым поток специально создается для работы

//с текствыми файлами. позволяет работать с ними быстрее за счет разнообразных готовых функции чтения.

QTextStream in(&f); //записываем заголовок файл

in<<"Name Price";

in<<"\n";

in<<"------------- -------------";

in<<"\n";

for(int i=0; i<ui->tableWidget_check->rowCount();i++)

{

buf=ui->tableWidget_check->item(i,0)->text();

if(buf.length()>13)

{

in<<buf.left(13);

in<<"-\n";

in<<buf.right(buf.length()-13);

in<<"\n";

}

else

{

in<<buf;

in<<"\n";

}

}

}

f. close ();

}

ПРИЛОЖЕНИЕ Б


Дата добавления: 2015-07-11; просмотров: 62 | Нарушение авторских прав


Читайте в этой же книге: ОБЗОР ЛИТЕРАТУРЫ | Диаграмма прецедентов | АРХИТЕКТУРА ПРОГРАММНОГО МОДУЛЯ | ТЕСТИРОВАНИЕ |
<== предыдущая страница | следующая страница ==>
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ| Клиническая анатомия системы кровообращения

mybiblioteka.su - 2015-2024 год. (0.04 сек.)