Создание графических интерфейсов пользователя с использованием Qt 5.12 (1245345), страница 11
Текст из файла (страница 11)
При создании интерфейсов достаточно часто возникает необходимость вывода на экран табличных данных. Библиотека Qt с этойцелью предоставляет специальный класс QTableWidget. Объект этого класса – таблица,каждая ячейка которой – объект класса QTableWidgetItem (рисунок 2.22).QWidgetQTableWidgetItemprintFormQTableWidgetprintForm()showAll()showResults()QPushButtomабРисунок 2.22 - Внешний вид (а) и диаграмма классов (б) формы вывода записей на экранОба класса предлагают большое количество методов, позволяющих создавать наэкране таблицы с текстовой и графической информацией, а также выводить и вводить изних данные [21].
В рассматриваемом примере таблица используется только для выводарезультатов, поэтому объекты класса ячейки создаются с флагами Qt::NoItemFlags,запрещающими не только изменение, но и выделение ячеек.Описание класса помещаем в файл printForm.h:#ifndef printForm_h#define printForm_h#include "bookFile.h"#include <QTableWidget>#include <QPushButton>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"#include <QHBoxLayout>#include <QMessageBox>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.f->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();}}Класс формы поиска.
По структуре форма поиска аналогична форме ввода, поэтому их классы имеют одинаковую структуру (рисунок 2.23).QWidgetfindFormQLabelQLineEditfindForm()findRecs()QPushButtomабРисунок 2.23. Внешний вид и диаграмма классов формы поискаОписание класса поместим в файл findForm.h:#ifndef findForm_h#define findForm_h#include <QLabel>#include "printForm.h"class findForm : public QWidget{Q_OBJECTQLabel * 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"#include <QVBoxLayout>#include <QLineEdit>#include <QTextCodec>#define RUS(str) codec->toUnicode(str)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"#include <QApplication>int main(int argc, char *argv[]){QApplication appl(argc,argv);Window win;win.show();return appl.exec();}Сборка приложения может осуществляться как в консольном режиме, так и в средахQt Creator или Visual Studio.ЛИТЕРАТУРА1. Шлее М. Qt 5.3.
Профессиональное программирование на С++. – СПб.: БХВПетербург, 2015.ПРИЛОЖЕНИЕ А. УСТАНОВКА QT НА КОМПЬЮТЕРДля установки библиотеки Qt необходимо скачать инсталляционные модули с сайтаразработчика https://www.qt.io/download.Фирма предлагает установить коммерческий продукт или продукт Open Source.Установка при этом выполняется с помощью Online-инсталлятора. Возможна и установкаOffline, что предпочтительно, поскольку иначе процесс установки может растянуться начасы.
Для получения доступа к скачиванию Qt для автономной установки необходимо использовать адрес https://www.qt.io/offline-installers.Комплект средств разработки Qt SDK существуют для 32-х и 64-х разрядных Windows, Linux, Mac OS X и др. Он включает собственно библиотеку Qt, бесплатный компилятор С++ minGW и бесплатную интегрированную среду создания приложений Qt Creator.Нужные компоненты можно выбрать в процессе установки выбранной версии Qt (рисунокA.1).Рисунок A.1 – Выбор компонентов при установке Qt 5.12.1Для создания Qt приложений с использованием среды Microsoft Visual Studio2017 Community необходимо выбрать соответственно 32-х или 64-х разрядный вариантQt под MSVC, установить его, а затем установить специальный Qt-плагин для VS 2017.Для этого в VS 2017 выбираем пункт меню:Средства/Расширения и обновления/В сети/Поиск/Qt .Среди найденных в сети компонентов выбираем плагин Qt Visual Studio Tools, который необходимо скачать и установить.
Плагин встраивается в среду, добавляя специальные пункты в меню, и позволяет создавать и отлаживать приложения Qt разных типовнепосредственно в среде Visual Studio 2017.Для работы с Qt в командном режиме на компьютере должна быть установлена: для работы с Visual C++ – библиотека Qt MSVC 2017; для работы с бесплатным компилятором С++ minGW – библиотека MinGW.В первом случае естественно также должна быть установлена среда Visual Studio2017 Community, а во втором – средства компиляции, сборки и отладки С++ из GNU Compiler Collection (это можно сделать, выбрав соответствующий инструмент при установкеQt).Для работы с Qt в среде Qt Creator на компьютер необходимо установить Qt Creator вместе со средствами отладки программ (Qt Creator CBD Debugger).Русскоязычный вариант справочной системы (к сожалению, только для QT 4)можно взять на сайте http://doc.crossplatform.ru/qt/.
Описание основных классов при переходе к следующей версии не изменилось, поэтому этот перевод упрощает работу с библиотекой..