feat: added data model and ui for main window

This commit is contained in:
2026-01-17 14:08:34 +03:00
parent eb4b3557fa
commit f6ec31183a
19 changed files with 273 additions and 7 deletions

View File

@@ -10,6 +10,7 @@ find_package(Qt5 COMPONENTS
Core Core
Gui Gui
Widgets Widgets
Sql
REQUIRED REQUIRED
) )
@@ -18,6 +19,7 @@ file(GLOB
"src/*" "src/*"
"src/MainWidget/*" "src/MainWidget/*"
"src/LicenseModel/*" "src/LicenseModel/*"
"deps/deps.qrc"
) )
add_executable( add_executable(

View File

View File

View File

View File

View File

View File

BIN
deps/add.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

BIN
deps/delete.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 KiB

6
deps/deps.qrc vendored
View File

@@ -2,5 +2,11 @@
<RCC version="1.0"> <RCC version="1.0">
<qresource prefix="/deps"> <qresource prefix="/deps">
<file alias="icon.png">icon.png</file> <file alias="icon.png">icon.png</file>
<file alias="reload.png">reload.png</file>
<file alias="add.png">add.png</file>
<file alias="edit.png">edit.png</file>
<file alias="delete.png">delete.png</file>
<file alias="info.png">info.png</file>
<file alias="tables.ddl">tables.ddl</file>
</qresource> </qresource>
</RCC> </RCC>

BIN
deps/edit.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
deps/info.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
deps/reload.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

15
deps/tables.ddl vendored Normal file
View File

@@ -0,0 +1,15 @@
CREATE TABLE IF NOT EXISTS clients (
id INTEGER PRIMARY KEY AUTOINCREMENT,
city TEXT NOT NULL,
email TEXT NOT NULL,
firstName TEXT NOT NULL,
hardwareHash TEXT NOT NULL,
lastName TEXT NOT NULL,
patronymic TEXT NOT NULL,
phone TEXT NOT NULL,
yourCompany TEXT NOT NULL,
comment TEXT
);
COMMENT ON TABLE clients IS '';
COMMENT ON FIELD clients.id IS '';

View File

@@ -1,5 +1,81 @@
//
// Created by debian on 1/16/26.
//
#include "LicenseModel.h" #include "LicenseModel.h"
const static int COLUMN_COUNT = 9;
LicenseModel::LicenseModel(QObject* parent)
: QAbstractTableModel(parent)
{
}
LicenseModel::~LicenseModel()
{
}
int LicenseModel::rowCount(const QModelIndex &parent) const
{
return 0;
}
int LicenseModel::columnCount(const QModelIndex &parent) const
{
return COLUMN_COUNT;
}
QVariant LicenseModel::data(const QModelIndex &index, int role) const
{
switch (role)
{
case Qt::DisplayRole:
break;
case Qt::ToolTipRole:
return {}; // TODO: return client id
default:
return {};
}
return {};
}
QVariant LicenseModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole)
return {};
if (orientation == Qt::Vertical)
return QString::number(section + 1);
switch (section)
{
case 0:
return tr("Last name");
case 1:
return tr("First name");
case 2:
return tr("Patronymic");
case 3:
return tr("Email");
case 4:
return tr("Phone number");
case 5:
return tr("Company");
case 6:
return tr("City");
case 7:
return tr("Created date");
case 8:
return tr("Comment");
default:
return {};
}
}
LicenseModel::Status LicenseModel::getStatus()
{
}
QString LicenseModel::getStatusText()
{
}

View File

@@ -1,8 +1,50 @@
#ifndef LICENSEMANAGER_LICENSEMODEL_H #ifndef LICENSEMANAGER_LICENSEMODEL_H
#define LICENSEMANAGER_LICENSEMODEL_H #define LICENSEMANAGER_LICENSEMODEL_H
#include <QAbstractTableModel>
class LicenseModel {}; class LicenseModel : public QAbstractTableModel
{
Q_OBJECT
public:
enum class Status
{
None = 0,
Ok,
DbStructError,
DbExistError,
};
struct LicenseItem
{
QString id;
QString city;
QString email;
QString firstName;
QString hardwareHash;
QString lastName;
QString patronymic;
QString phone;
QString yourCompany;
QString comment;
};
explicit LicenseModel(QObject* parent = nullptr);
~LicenseModel();
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
Status getStatus();
QString getStatusText();
private:
QList<LicenseItem> m_data;
QStringList m_errors;
};
#endif // LICENSEMANAGER_LICENSEMODEL_H #endif // LICENSEMANAGER_LICENSEMODEL_H

View File

@@ -1,22 +1,66 @@
#include "MainWidget.h" #include "MainWidget.h"
// Qt // Qt
#include <QMenu>
#include <QMessageBox>
#include <QTableView> #include <QTableView>
#include <QToolBar>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QContextMenuEvent>
// Qt
#include <QAction>
// Self
#include "LicenseModel/LicenseModel.h"
MainWidget::MainWidget(QWidget *parent) MainWidget::MainWidget(QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
, m_licenseModel(new LicenseModel(this))
{ {
setWindowIcon(QIcon(":/icon.png")); setWindowIcon(QIcon(QStringLiteral("qrc:/deps/icon.png")));
setWindowTitle("LicenseManager"); setWindowTitle("LicenseManager");
resize({640, 480}); resize({800, 600});
// Ui // Ui
{ {
m_tableView = new QTableView(this); m_tableView = new QTableView(this);
m_tableView->setModel(m_licenseModel);
setCentralWidget(m_tableView); setCentralWidget(m_tableView);
// ToolTip
{
m_toolBar = addToolBar("ToolBar");
m_toolBar->setMovable(false);
m_addClientToolBarAction = m_toolBar->addAction(QIcon(QStringLiteral(":/deps/add.png")), tr("Add client"));
m_infoToolBarAction = m_toolBar->addAction(QIcon(QStringLiteral(":/deps/info.png")), tr("Get info"));
connect(m_addClientToolBarAction, &QAction::triggered, this, &MainWidget::onAddClientTriggered);
connect(m_infoToolBarAction, &QAction::triggered, this, &MainWidget::onGetInfoTriggered);
} }
// Table Menu
{
m_menu = new QMenu(m_tableView);
m_reloadTableMenuAction = m_menu->addAction(QIcon(QStringLiteral(":/deps/reload.png")), tr("Reload table"));
m_menu->addSeparator();
m_addClientsMenuAction = m_menu->addAction(QIcon(QStringLiteral(":/deps/add.png")), tr("Add client"));
m_editClientsMenuAction = m_menu->addAction(QIcon(QStringLiteral(":/deps/edit.png")), tr("Edit client"));
m_deleteClientsMenuAction = m_menu->addAction(QIcon(QStringLiteral(":/deps/delete.png")), tr("Delete client"));
connect(m_reloadTableMenuAction, &QAction::triggered, this, &MainWidget::onAddClientTriggered);
connect(m_addClientsMenuAction, &QAction::triggered, this, &MainWidget::onAddClientTriggered);
connect(m_editClientsMenuAction, &QAction::triggered, this, &MainWidget::onEditClientTriggered);
connect(m_deleteClientsMenuAction, &QAction::triggered, this, &MainWidget::onDeleteClientTriggered);
m_tableView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_tableView, &QTableView::customContextMenuRequested,
this, &MainWidget::onCustomContextMenuRequested);
}
}
m_tableView->resizeColumnsToContents();
loadSettings(); loadSettings();
} }
@@ -25,6 +69,52 @@ MainWidget::~MainWidget()
saveSettings(); saveSettings();
} }
void MainWidget::onCustomContextMenuRequested(const QPoint &pos)
{
m_menu->popup(m_tableView->viewport()->mapToGlobal(pos));
}
void MainWidget::onGetInfoTriggered()
{
}
void MainWidget::onReloadTableTriggered()
{
}
void MainWidget::onAddClientTriggered()
{
}
void MainWidget::onEditClientTriggered()
{
}
void MainWidget::onDeleteClientTriggered()
{
}
void MainWidget::closeEvent(QCloseEvent *event)
{
QMessageBox::StandardButton reply;
reply = QMessageBox::question(
this,
tr("Confirmation of exit"),
tr("Are you sure you want to exit the app?"),
QMessageBox::Yes | QMessageBox::No
);
if (reply == QMessageBox::Yes)
event->accept();
else
event->ignore();
}
void MainWidget::loadSettings() void MainWidget::loadSettings()
{ {

View File

@@ -4,6 +4,11 @@
// Qt // Qt
#include <QMainWindow> #include <QMainWindow>
class QTableView; class QTableView;
class QMenu;
class QAction;
// Self
class LicenseModel;
class MainWidget : public QMainWindow class MainWidget : public QMainWindow
{ {
@@ -11,11 +16,33 @@ class MainWidget : public QMainWindow
public: public:
explicit MainWidget(QWidget *parent = nullptr); explicit MainWidget(QWidget *parent = nullptr);
~MainWidget(); ~MainWidget();
protected:
void closeEvent(QCloseEvent *event) override;
private slots:
void onCustomContextMenuRequested(const QPoint &pos);
void onGetInfoTriggered();
void onReloadTableTriggered();
void onAddClientTriggered();
void onEditClientTriggered();
void onDeleteClientTriggered();
private: private:
void saveSettings(); void saveSettings();
void loadSettings(); void loadSettings();
private: private:
QTableView* m_tableView{nullptr}; QTableView* m_tableView{nullptr};
LicenseModel* m_licenseModel{nullptr};
QToolBar* m_toolBar{nullptr};
QMenu* m_menu{nullptr};
QAction* m_addClientToolBarAction{nullptr};
QAction* m_infoToolBarAction{nullptr};
QAction* m_reloadTableMenuAction{nullptr};
QAction* m_addClientsMenuAction{nullptr};
QAction* m_deleteClientsMenuAction{nullptr};
QAction* m_editClientsMenuAction{nullptr};
}; };

8
src/def.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef LICENSEMANAGER_DEF_H
#define LICENSEMANAGER_DEF_H
#include <QString>
const static QStringView DB_PATH = "./db.sqlite";
#endif //LICENSEMANAGER_DEF_H