diff options
Diffstat (limited to 'works/life/cpp-practicum/main.cpp')
-rw-r--r-- | works/life/cpp-practicum/main.cpp | 297 |
1 files changed, 25 insertions, 272 deletions
diff --git a/works/life/cpp-practicum/main.cpp b/works/life/cpp-practicum/main.cpp index 0f90b74..a6c92e5 100644 --- a/works/life/cpp-practicum/main.cpp +++ b/works/life/cpp-practicum/main.cpp @@ -1,281 +1,34 @@ -#include "Base.hpp"
-#include "StringUtil.hpp"
+#include "qboxlayout.h"
+#include "qnamespace.h"
+#include <QApplication>
+#include <QHBoxLayout>
+#include <QMainWindow>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QWidget>
-#include <fstream>
-#include <iostream>
-#include <optional>
-#include <ostream>
-#include <stdexcept>
-#include <string>
-#include <string_view>
-#include <type_traits>
+int main(int argc, char *argv[]) {
+ QApplication application(argc, argv);
-inline std::u16string_view ToUtf16View(const std::wstring &str) {
- return std::u16string_view(reinterpret_cast<const char16_t *>(str.c_str()),
- str.size());
-}
-
-inline std::wstring_view ToWStringView(std::u16string_view str) {
- return std::wstring_view(reinterpret_cast<const wchar_t *>(str.data()),
- str.size());
-}
-
-class SerializationException : public std::runtime_error {
-public:
- using runtime_error::runtime_error;
-};
-
-std::vector<std::string_view> SplitByVerticalLine(std::string_view str,
- int field_count) {
- std::vector<std::string_view> fields;
- gsl::index current_position = 0;
-
- for (int i = 0; i < field_count - 1; i++) {
- auto pos = str.find('|', current_position);
- if (pos == std::string::npos) {
- throw SerializationException("Failed to find next splitter('|').");
- }
- fields.push_back(str.substr(current_position, pos - current_position));
- current_position = pos + 1;
- }
- fields.push_back(str.substr(current_position));
-
- return fields;
-}
-
-class Book final {
-public:
- Book() = default;
-
- Book(std::u16string isbn, std::u16string title, std::u16string type,
- std::u16string author, std::u16string press, int stock_count)
- : isbn_(std::move(isbn)), title_(std::move(title)),
- type_(std::move(type)), author_(std::move(author)),
- press_(std::move(press)), stock_count_(stock_count) {}
-
- CRU_DEFAULT_COPY(Book)
- CRU_DEFAULT_MOVE(Book)
-
- ~Book() = default;
-
-public:
- std::u16string GetIsbn() const { return isbn_; }
- void SetIsbn(std::u16string isbn) { isbn_ = std::move(isbn); }
-
- std::u16string GetTitle() const { return title_; }
- void SetTitle(std::u16string title) { title_ = std::move(title); }
-
- std::u16string GetType() const { return type_; }
- void SetType(std::u16string type) { type_ = std::move(type); }
-
- std::u16string GetAuthor() const { return author_; }
- void SetAuthor(std::u16string author) { author_ = std::move(author); }
-
- std::u16string GetPress() const { return press_; }
- void SetPress(std::u16string press) { press_ = std::move(press); }
-
- int GetStockCount() const { return stock_count_; }
- void SetStockCount(int stock_count) { stock_count_ = stock_count; }
-
-private:
- std::u16string isbn_;
- std::u16string title_;
- std::u16string type_;
- std::u16string author_;
- std::u16string press_;
- int stock_count_;
-};
-
-std::istream &operator>>(std::istream &left, Book &right) {
- std::string line;
- std::getline(left, line);
-
- std::vector<std::string_view> fields = SplitByVerticalLine(line, 6);
-
- right.SetIsbn(cru::ToUtf16(fields[0]));
- right.SetTitle(cru::ToUtf16(fields[1]));
- right.SetType(cru::ToUtf16(fields[2]));
- right.SetAuthor(cru::ToUtf16(fields[3]));
- right.SetPress(cru::ToUtf16(fields[4]));
- right.SetStockCount(std::stoi(std::string(fields[5])));
-
- return left;
-}
-
-std::ostream &operator<<(std::ostream &left, const Book &right) {
- left << cru::ToUtf8(right.GetIsbn()) << '|' << cru::ToUtf8(right.GetTitle())
- << '|' << cru::ToUtf8(right.GetType()) << '|'
- << cru::ToUtf8(right.GetAuthor()) << '|' << cru::ToUtf8(right.GetPress())
- << '|' << right.GetStockCount();
- return left;
-}
-
-void PrettyPrint(std::wostream &stream, const Book &book) {
- stream << L"ISBN: " << ToWStringView(book.GetIsbn()) << L"\n";
- stream << L"标题: " << ToWStringView(book.GetTitle()) << L"\n";
- stream << L"类型: " << ToWStringView(book.GetType()) << L"\n";
- stream << L"作者: " << ToWStringView(book.GetAuthor()) << L"\n";
- stream << L"出版社: " << ToWStringView(book.GetPress()) << L"\n";
- stream << L"库存: " << book.GetStockCount() << L"\n";
-}
-
-class Vendor final {
-public:
- Vendor() = default;
- Vendor(int id, std::u16string name, std::u16string type,
- std::u16string address, std::u16string phone)
- : id_(id), name_(std::move(name)), type_(std::move(type)),
- address_(std::move(address)), phone_(std::move(phone)) {}
-
- CRU_DEFAULT_COPY(Vendor)
- CRU_DEFAULT_MOVE(Vendor)
-
- ~Vendor() = default;
-
-public:
- int GetId() const { return id_; }
- void SetId(int id) { id_ = id; }
-
- std::u16string GetName() const { return name_; }
- void SetName(std::u16string name) { name_ = std::move(name); }
-
- std::u16string GetType() const { return type_; }
- void SetType(std::u16string type) { type_ = std::move(type); }
-
- std::u16string GetAddress() const { return address_; }
- void SetAddress(std::u16string address) { address_ = std::move(address); }
-
- std::u16string GetPhone() const { return phone_; }
- void SetPhone(std::u16string phone) { phone_ = std::move(phone); }
-
-private:
- int id_;
- std::u16string name_;
- std::u16string type_;
- std::u16string address_;
- std::u16string phone_;
-};
-
-std::istream &operator>>(std::istream &left, Vendor &right) {
- std::string line;
- std::getline(left, line);
-
- std::vector<std::string_view> fields = SplitByVerticalLine(line, 5);
-
- right.SetId(std::stoi(std::string(fields[0])));
- right.SetName(cru::ToUtf16(fields[1]));
- right.SetType(cru::ToUtf16(fields[2]));
- right.SetAddress(cru::ToUtf16(fields[3]));
- right.SetPhone(cru::ToUtf16(fields[4]));
-
- return left;
-}
-
-std::ostream &operator<<(std::ostream &left, const Vendor &right) {
- left << right.GetId() << '|' << cru::ToUtf8(right.GetName()) << '|'
- << cru::ToUtf8(right.GetType()) << '|' << cru::ToUtf8(right.GetAddress())
- << '|' << cru::ToUtf8(right.GetPhone());
- return left;
-}
-
-class Record final {
-public:
- Record();
-
- CRU_DEFAULT_COPY(Record);
- CRU_DEFAULT_MOVE(Record);
-
- ~Record() = default;
-
-public:
- void WriteTo(std::ostream &stream);
- void ReadFrom(std::istream &stream);
-
- 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);
-
-private:
- std::vector<Book> books_;
- std::vector<Vendor> vendors_;
-};
-
-void Record::WriteTo(std::ostream &stream) {
- stream << books_.size() << ' ' << vendors_.size() << '\n';
- for (const auto &book : books_) {
- stream << book << '\n';
- }
- for (const auto &vendor : vendors_) {
- stream << vendor << '\n';
- }
-}
-
-void Record::ReadFrom(std::istream &stream) {
- books_.clear();
- vendors_.clear();
- int book_count, vendor_count;
- stream >> book_count >> vendor_count;
- stream >> std::ws;
- for (int i = 0; i < book_count; i++) {
- Book book;
- stream >> book;
- books_.push_back(std::move(book));
- }
- for (int i = 0; i < vendor_count; i++) {
- Vendor vendor;
- stream >> vendor;
- vendors_.push_back(std::move(vendor));
- }
-}
+ QMainWindow main_window;
-int main() {
- Record record;
+ QWidget centeral_area;
+ QVBoxLayout central_area_layout;
+ centeral_area.setLayout(¢ral_area_layout);
- while (true) {
- std::wcout << L"1. 查询 2. 添加 0. 退出\n";
- int choice = 0;
- std::wcin >> choice;
- if (choice == 1) {
- std::wcout
- << L"1. 图书 2. 供应商\n输入数字选择操作,其他任意字符将退出程序。\n";
- choice = 0;
- std::wcin >> choice;
- if (choice == 1) {
- std::wcout << L"请输入图书编号:\n";
- std::wstring isbn;
- std::wcin >> isbn;
- auto find_result = record.FindBookByIsbn(ToUtf16View(isbn));
- if (find_result) {
- PrettyPrint(std::wcout, *find_result);
- std::wcout << L"0. 返回主菜单 1. 修改 2. 删除\n";
- choice = 0;
- std::wcin >> choice;
- if (choice == 1) {
- // TODO:
- } else if (choice == 2) {
- record.RemoveBookByIsbn(ToUtf16View(isbn));
- std::wcout << L"删除成功。\n";
- }
- } else {
- std::wcout << L"该书不存在。\n";
- }
- } else if (choice == 2) {
+ main_window.setCentralWidget(¢eral_area);
- } else {
- return 0;
- }
+ QWidget top_bar;
+ QHBoxLayout top_bar_layout;
+ top_bar.setLayout(&top_bar_layout);
+ central_area_layout.addWidget(&top_bar);
- } else if (choice == 2) {
+ QPushButton import_button(QStringLiteral("导入"));
+ QPushButton export_button(QStringLiteral("导出"));
+ top_bar_layout.addWidget(&import_button);
+ top_bar_layout.addWidget(&export_button);
- } else {
- return 0;
- }
- }
+ main_window.show();
- return 0;
+ return application.exec();
}
|