Читайте также:
|
|
Листинг программы
Файл 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ | | | Клиническая анатомия системы кровообращения |