Диплом (1189781), страница 6
Текст из файла (страница 6)
qry.prepare("select tip from tipnaspunkt;");
qry.exec();
nasel->setQuery(qry);
ui->comboBox->setModel(nasel);
int index = ui->comboBox->findText(dobavtipnas);
if(index != -1){
ui->comboBox->setCurrentIndex(index);
}
Ниже приведена часть кода, отвечающая за добавление записей в таблицу. В первые две переменные записываются значения, введенные пользователем. Далее, выполняется запрос для нахождения уникального номера той записи, которая из другой таблицы, так как в таблицу «Населенный пункт» записывается ее идентификатор. Переменная «all» отвечает за ячейку таблицы, которая включает полностью название населенного пункта вместе с его типом, поэтому она получается сложением этих строк, плюс символ пробела. Далее проверяется, ввел ли пользователь название населенного пункта, если да, то выполняется запрос на добавление записей в таблицу. Запрос начинается с INSERT INTO после чего указывается название таблицы, поля и значения.
QString tipnas=ui->comboBox->currentText();
QString nas=ui->lineEdit->text();
QSqlQuery qry1;
qry1.prepare("select id from tipnaspunkt where tip = :tipnas;");
qry1.bindValue(":tipnas", tipnas);
qry1.exec();
qry1.next();
int tipnasid = qry1.value(0).toInt();
QString all = tipnas+" "+nas;
if(nas !=""){
qry1.prepare("insert into naselpunkt (tipnaspunkt_id, namenaselpunkt, naselpunkt) values (:tipnasid, :nas, :all);");
qry1.bindValue(":tipnasid", tipnasid);
qry1.bindValue(":nas", nas);
qry1.bindValue(":all", all);
qry1.exec();
close();
}
Редактирование строк в таблице можно рассмотреть на примере таблицы «Фидеры ТП» (рисунок 16). Форма редактирования похожа на форму для добавления, только в comboBox и lineEdit отображаются текущие значения выбранной пользователем строки, которые при необходимости, пользователь может изменить.
Рисунок 16 – Форма для редактирования записи из таблицы «Фидеры ТП»
Рассмотрим часть кода, отвечающую за редактирование записи из таблицы «Фидеры ТП». Первым этапом, в переменные передаются текущие значения полей. Далее, вызывается диалоговое окно, где сообщаются строки, которые выделены пользователем в tableView. По записанным в переменные значениям находится id записей в таблицах «Трансформаторная подстанция», «Тип фидера» и «Фидер ТП». Далее, в переменные записываются измененные пользователем значения, и вычисляются id этих строк в связанных таблицах. Когда все данные получены, необходимо сформировать запрос на изменение записи. Оператор UPDATE обновляет столбцы в соответствии с их новыми значениями в строках существующей таблицы. В выражении SET указывается, какие именно столбцы следует модифицировать и какие величины должны быть в них установлены. В выражении WHERE, задается, какие строки подлежат обновлению.
QString tp = model->data(model->index(ui->tableView->currentIndex().row(), 1), Qt::DisplayRole).toString();
QString fid = model->data(model->index(ui->tableView->currentIndex().row(), 2), Qt::DisplayRole).toString();
QString tip = model->data(model->index(ui->tableView->currentIndex().row(), 3), Qt::DisplayRole).toString();
edfidertp nas (table,model->data( model->index(ui->tableView->currentIndex() .row(),1),Qt::DisplayRole).toString(),model->data(model->index (ui->tableView->currentIndex().row(),2),Qt::DisplayRole).toString(),model->data (model->index (ui->tableView->currentIndex().row(),3),Qt::DisplayRole).toString() ,model->data (model->index(ui->tableView->currentIndex().row(),4),Qt::DisplayRole).toString() );
QSqlQuery qry1;
qry1.prepare ("select id from transfp where tp=:tp;");
qry1.bindValue(":tp", tp);
qry1.exec();
qry1.next();
int tpid= qry1.value(0).toInt();
qry1.prepare ("select id from tipfidera where tipfidera=:tip;");
qry1.bindValue(":tip", tip);
qry1.exec();
qry1.next();
int tipid= qry1.value(0).toInt();
qry1.prepare ("select id from fidertp where transfp_id=:tpid and tipfidera_id=:tipid and fider=:fid;");
qry1.bindValue(":tpid", tpid);
qry1.bindValue(":tipid", tipid);
qry1.bindValue(":fid", fid);
qry1.exec();
qry1.next();
int id= qry1.value(0).toInt();
nas.exec();
QString tp1=nas.tp();
QString fider=nas.fider();
QString tip1=nas.tip();
QString fiderimp=nas.fiderimp();
qry1.prepare ("select id from transfp where tp=:tp1;");
qry1.bindValue(":tp1", tp1);
qry1.exec();
qry1.next();
int tp1id= qry1.value(0).toInt();
qry1.prepare ("select id from tipfidera where tipfidera=:tip1;");
qry1.bindValue(":tip1", tip1);
qry1.exec();
qry1.next();
int tip1id= qry1.value(0).toInt();
qry1.prepare ("update fidertp set transfp_id=:tp1id, fider=:fider, tipfidera_id=:tip1id, fiderimp=:fiderimp, opisfideratp=concat(:tp1, ' ', :fider, ' ', :tip1, ' ', :fiderimp) where id=:id;");
qry1.bindValue(":tp1id", tp1id);
qry1.bindValue(":fider", fider);
qry1.bindValue(":tip1id", tip1id);
qry1.bindValue(":fiderimp", fiderimp);
qry1.bindValue(":tp1", tp1);
qry1.bindValue(":tip1", tip1);
qry1.bindValue(":id", id);
qry1.exec();
qry->exec();
model->setQuery(*qry);
ui->tableView->setModel(model);
Для удобства работы с таблицами используются горячие клавиши. В данной АИС горячие клавиши предусмотрены: для кнопки удаления – Ctrl+X, для добавления – Ctrl+S, для редактирования – Ctrl+A, для фильтрования – Ctrl+F, а также для вывода на печать и создания отчета – Ctrl+R. Ниже приведена часть кода, отвечающая за создание горячих клавиш.
ui->delete_2->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_X));
ui->action_2->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_S));
ui->redakt->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_A));
ui->filtr->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_F));
ui->print->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_R));
Метод setShortcut является слотом и устанавливает последовательность горячих клавиш. При этом, если QKeySequence содержит несколько сочетаний клавиш, то они все будут зарегистрированы.
Фильтрование рассмотрено на примере таблицы «Показания в точке подключения». При выборе фильтра появляется диалоговое окно, где пользователю предлагают выбрать период за который он хочет посмотреть показания электроэнергии (рисунок 17).
Рисунок 17 – Фильтрование по дате показаний
Когда пользователь выбрал фильтрование, вызывается диалоговое окно, где пользователю предлагают указать период, за который необходимо узнать требуемую информацию. Создаются две переменные, в которые записываются указанные пользователем даты, а также модель и запрос. Далее, составляется запрос с выборкой всех данных из таблицы в том промежутке, который указал пользователь. После чего запрос выполняется, и результат выводится на экран пользователю.
Filtr fil(db, “”, “”);
fil.exec();
Qstring data1=fil.data1();
Qstring data2=fil.data2();
model = new QsqlQueryModel;
qry = new QsqlQuery;
qry->prepare(“select * from pokazania where datap between :data1 and :data2;”);
qry->bindValue(“:data1”, data1);
qry->bindValue(“:data2”, data2);
qry->exec();
model->setQuery(*qry);
ui->tableView->setModel(model);
Там, где это возможно необходимо применять регулярные выражения для избегания добавления некорректных данных в таблицу. Ниже приведен пример использования регулярных выражений для номера телефона и email. Функция возвращает true, если для регулярного выражения есть соответствие в этой строке, в противном случае возвращает false.
ui->lineEdit_5->text().contains(QRegExp("^[0-9]{11}$"));
ui->lineEdit_6->text().contains(QRegExp("^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"));
В базе данных ООО «СЭК» существует возможность вывода на печать содержимого таблиц и сохранение этих данных на компьютере в формате .XPS. Для этого, необходимо прописать в pro файле проекта QT += printsupport для использования возможностей сохранения и печати.
Для основной таблицы по показаниям электроэнергии при выводе на печать, формируется отчетный документ (рисунок 18).
Рисунок 18 – Формирование отчета
Ниже приведен код, отвечающий за запись таблиц в документ и вывод на печать. Первым этапом, необходимо посчитать количество строк и столбцов в активной таблице.
Весь документ основывается на html разметке, поэтому здесь применяются теги для работы с таблицами [26]:
– <table> – служит контейнером для элементов, определяющих содержимое таблицы;
– <tr> – служит контейнером для создания строки таблицы;
– <td> – предназначен для создания одной ячейки таблицы;
– <th> – предназначен для создания одной ячейки таблицы, которая обозначается как заголовочная;
– <thead> – предназначен для хранения одной или нескольких строк, которые представлены вверху таблицы.
В первом цикле, по столбцам выводятся названия полей таблицы, если они не спрятаны. Далее, построчно выводится содержимое активной таблицы, также как и с заголовками, если оно не скрыто. Здесь simplified () – возвращает строку, у которой пробельные символы удалены в начале и в конце, а все последовательные пробельные символы заменены одиночным пробелом [27]. Если в ячейке нет данных, то выводится пробел. Далее, создается текстовый документ. В данном случае, setHtml() – установка текста в формате HTML. После чего, подключается принтер и вызывается диалог принтера. Если диалог выполнился, то осуществляется вывод на печать.
QString strStream;
QTextStream out (&strStream);
const int rowCount = ui->tableView->model()->rowCount();
const int columnCount = ui->tableView->model()->columnCount();
out << "<html>\n" <<"<head></head>\n" "<body bgcolor = #ffffff>\n";
"<table border=1 cellpadding=2>\n";
for(int column = 0; column < columnCount; column++)
if(!ui->tableView->isColumnHidden(column))
out <<QString("<th>%1</th>").arg(ui->tableView->model()->headerData (column, Qt::Horizontal).toString());
out <<"</tr></thead>\n";
for(int row = 0; row<rowCount; row++){
out << "<tr>";
for(int column= 0; column<columnCount; column++){
if(!ui->tableView->isColumnHidden(column)){
QString data = ui->tableView->model()->data(ui->tableView-> model()->index(row, column)).toString().simplified();
out <<QString("<td bkcolor=0>%1</td>").arg((!data.isEmpty())? data:QString(" "));
}
}
out <<"</tr>\n";
}
out <<"</table>\n""</body>\n""</html>\n";
QTextDocument *document = new QTextDocument();
document->setHtml(strStream);
QPrinter printer;
QPrintDialog *dialog = new QPrintDialog(&printer, 0);
if(dialog->exec() == QDialog::Accepted){
document->print(&printer);
}
delete document;
При входе пользователя в систему появляется окно авторизации, где предоставляются поля для ввода логина и пароля (рисунок 19).















