diff options
Diffstat (limited to 'works')
| -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();
  | 
