From d0b6d6377de44484568af2ef3a3bbd4da7cdfb4b Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 30 Dec 2020 17:23:15 +0800 Subject: import(life): ... --- works/life/cpp-practicum/Book.hpp | 2 +- works/life/cpp-practicum/Record.cpp | 147 ++++++++++++++++++++++++++++++++++++ works/life/cpp-practicum/Record.hpp | 35 ++++++--- works/life/cpp-practicum/main.cpp | 22 +++++- 4 files changed, 194 insertions(+), 12 deletions(-) (limited to 'works/life/cpp-practicum') diff --git a/works/life/cpp-practicum/Book.hpp b/works/life/cpp-practicum/Book.hpp index 2fb1123..250460f 100644 --- a/works/life/cpp-practicum/Book.hpp +++ b/works/life/cpp-practicum/Book.hpp @@ -44,7 +44,7 @@ private: std::u16string type_; std::u16string author_; std::u16string press_; - int stock_count_; + int stock_count_ = 0; }; QTextStream &operator>>(QTextStream &left, Book &right); diff --git a/works/life/cpp-practicum/Record.cpp b/works/life/cpp-practicum/Record.cpp index 1041b23..ac367df 100644 --- a/works/life/cpp-practicum/Record.cpp +++ b/works/life/cpp-practicum/Record.cpp @@ -1,4 +1,7 @@ #include "Record.hpp" +#include "QAbstractitemmodel.h" +#include "qnamespace.h" +#include "qvariant.h" void Record::WriteTo(QFile file) { file.open(QFile::ReadWrite | QFile::Text | QFile::Truncate); @@ -36,3 +39,147 @@ void Record::ReadFrom(QFile file) { vendors_.push_back(std::move(vendor)); } } + +int BookModel::rowCount(const QModelIndex &parent) const { + if (parent.isValid()) + return 0; + return static_cast(record_->GetBooks().size()); +} + +int BookModel::columnCount(const QModelIndex &parent) const { + if (parent.isValid()) + return 0; + return 6; +} + +QVariant BookModel::headerData(int section, Qt::Orientation orientation, + int role) const { + if (role != Qt::DisplayRole) + return QVariant(); + if (orientation == Qt::Horizontal) { + switch (section) { + case 0: + return QStringLiteral("ISBN"); + case 1: + return QStringLiteral("标题"); + case 2: + return QStringLiteral("类型"); + case 3: + return QStringLiteral("作者"); + case 4: + return QStringLiteral("出版社"); + case 5: + return QStringLiteral("库存"); + default: + return QVariant(); + } + } + return QVariant(); +} + +QVariant BookModel::data(const QModelIndex &index, int role) const { + if (role != Qt::DisplayRole) + return QVariant(); + + if (!index.isValid()) + return QVariant(); + + if (index.row() >= static_cast(record_->GetBooks().size()) || + index.row() < 0) + return QVariant(); + + int row = index.row(); + const Book &book = record_->GetBooks()[row]; + + int col = index.column(); + switch (col) { + case 0: + return QString::fromStdU16String(book.GetIsbn()); + case 1: + return QString::fromStdU16String(book.GetTitle()); + case 2: + return QString::fromStdU16String(book.GetType()); + case 3: + return QString::fromStdU16String(book.GetAuthor()); + case 4: + return QString::fromStdU16String(book.GetPress()); + case 5: + return book.GetStockCount(); + default: + return QVariant(); + } +} + +bool BookModel::setData(const QModelIndex &index, const QVariant &value, + int role) { + if (index.isValid() && role == Qt::EditRole) { + int row = index.row(); + Book &book = record_->GetBooks()[row]; + + int col = index.column(); + switch (col) { + case 0: + if (!value.canConvert()) + return false; + book.SetIsbn(value.toString().toStdU16String()); + return true; + case 1: + if (!value.canConvert()) + return false; + book.SetTitle(value.toString().toStdU16String()); + emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); + return true; + case 2: + if (!value.canConvert()) + return false; + book.SetType(value.toString().toStdU16String()); + emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); + return true; + case 3: + if (!value.canConvert()) + return false; + book.SetAuthor(value.toString().toStdU16String()); + emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); + return true; + case 4: + if (!value.canConvert()) + return false; + book.SetPress(value.toString().toStdU16String()); + emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); + return true; + case 5: + if (!value.canConvert()) + return false; + book.SetStockCount(value.toInt()); + emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); + return true; + default: + return false; + } + } + return false; +} + +Qt::ItemFlags BookModel::flags(const QModelIndex &index) const { + if (!index.isValid()) + return Qt::ItemIsEnabled; + + return QAbstractTableModel::flags(index) | Qt::ItemIsEditable; +} + +bool BookModel::insertRows(int row, int count, const QModelIndex &parent) { + beginInsertRows(parent, row, row + count - 1); + for (int i = 0; i < count; i++) { + record_->GetBooks().insert(record_->GetBooks().cbegin() + row, Book()); + } + endInsertRows(); + return true; +} + +bool BookModel::removeRows(int row, int count, const QModelIndex &parent) { + beginRemoveRows(parent, row, row + count - 1); + record_->GetBooks().erase(record_->GetBooks().cbegin() + row, + record_->GetBooks().cbegin() + row + count); + endRemoveRows(); + return true; +} diff --git a/works/life/cpp-practicum/Record.hpp b/works/life/cpp-practicum/Record.hpp index e39e626..78b70ba 100644 --- a/works/life/cpp-practicum/Record.hpp +++ b/works/life/cpp-practicum/Record.hpp @@ -4,13 +4,14 @@ #include "Book.hpp" #include "Vendor.hpp" +#include #include #include #include class Record final { public: - Record(); + Record() = default; CRU_DEFAULT_COPY(Record); CRU_DEFAULT_MOVE(Record); @@ -21,16 +22,32 @@ public: void WriteTo(QFile file); void ReadFrom(QFile file); - const std::vector &GetBooks() const { return books_; } - const std::vector &GetVendors() const { return vendors_; } - - // TODO: Implementation - std::optional FindBookByIsbn(std::u16string_view isbn); - - // TODO: Implementation - void RemoveBookByIsbn(std::u16string_view isbn); + std::vector &GetBooks() { return books_; } + std::vector &GetVendors() { return vendors_; } private: std::vector books_; std::vector vendors_; }; + +class BookModel : public QAbstractTableModel { +public: + explicit BookModel(Record *record) : record_(record) {} + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const override; + QVariant data(const QModelIndex &index, + int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, + int role = Qt::EditRole) override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + bool insertRows(int row, int count, + const QModelIndex &parent = QModelIndex()) override; + bool removeRows(int row, int count, + const QModelIndex &parent = QModelIndex()) override; + +private: + Record *record_; +}; \ No newline at end of file diff --git a/works/life/cpp-practicum/main.cpp b/works/life/cpp-practicum/main.cpp index 14847cc..b7e5db5 100644 --- a/works/life/cpp-practicum/main.cpp +++ b/works/life/cpp-practicum/main.cpp @@ -1,7 +1,9 @@ -#include "qboxlayout.h" -#include "qtableview.h" +#include "Record.hpp" +#include "qabstractitemview.h" + #include #include +#include #include #include #include @@ -20,19 +22,35 @@ int main(int argc, char *argv[]) { QPushButton import_button(QStringLiteral("导入")); QPushButton export_button(QStringLiteral("导出")); + QPushButton add_book_button(QStringLiteral("添加书")); + top_bar.addWidget(&import_button); top_bar.addWidget(&export_button); top_bar.addStretch(1); + top_bar.addWidget(&add_book_button); QHBoxLayout center_area; window_layout.addLayout(¢er_area); QTableView book_view; + book_view.verticalHeader()->hide(); + book_view.setSelectionBehavior(QAbstractItemView::SelectRows); + book_view.setEditTriggers(QAbstractItemView::DoubleClicked); + book_view.setSelectionMode(QAbstractItemView::SingleSelection); QTableView vendor_view; center_area.addWidget(&book_view); center_area.addWidget(&vendor_view); + Record record; + BookModel book_model(&record); + + book_view.setModel(&book_model); + + QObject::connect(&add_book_button, &QPushButton::clicked, [&book_model]() { + book_model.insertRow(book_model.rowCount()); + }); + window.show(); return application.exec(); -- cgit v1.2.3