diff options
author | crupest <crupest@outlook.com> | 2020-12-30 17:23:15 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-12-30 17:23:15 +0800 |
commit | d0b6d6377de44484568af2ef3a3bbd4da7cdfb4b (patch) | |
tree | ee87702ec50a5c5a26ee8fb446bd4995082bd792 | |
parent | 1e148e88abe8aca881590f4b9d992a2f03587ed7 (diff) | |
download | crupest-d0b6d6377de44484568af2ef3a3bbd4da7cdfb4b.tar.gz crupest-d0b6d6377de44484568af2ef3a3bbd4da7cdfb4b.tar.bz2 crupest-d0b6d6377de44484568af2ef3a3bbd4da7cdfb4b.zip |
import(life): ...
-rw-r--r-- | works/life/cpp-practicum/Book.hpp | 2 | ||||
-rw-r--r-- | works/life/cpp-practicum/Record.cpp | 147 | ||||
-rw-r--r-- | works/life/cpp-practicum/Record.hpp | 35 | ||||
-rw-r--r-- | works/life/cpp-practicum/main.cpp | 22 |
4 files changed, 194 insertions, 12 deletions
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<int>(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<int>(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<QString>())
+ return false;
+ book.SetIsbn(value.toString().toStdU16String());
+ return true;
+ case 1:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetTitle(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 2:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetType(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 3:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetAuthor(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 4:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetPress(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 5:
+ if (!value.canConvert<int>())
+ 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 <QAbstractTableModel>
#include <QFile>
#include <optional>
#include <vector>
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<Book> &GetBooks() const { return books_; }
- const std::vector<Vendor> &GetVendors() const { return vendors_; }
-
- // TODO: Implementation
- std::optional<Book> FindBookByIsbn(std::u16string_view isbn);
-
- // TODO: Implementation
- void RemoveBookByIsbn(std::u16string_view isbn);
+ std::vector<Book> &GetBooks() { return books_; }
+ std::vector<Vendor> &GetVendors() { return vendors_; }
private:
std::vector<Book> books_;
std::vector<Vendor> 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 <QApplication>
#include <QHBoxLayout>
+#include <QHeaderView>
#include <QMainWindow>
#include <QPushButton>
#include <QTableView>
@@ -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();
|