#include "QOrderListViewer.h" #include #include #include #include QOrderBookView::QOrderBookView(QWidget *parent) : QWidget(parent) { initUI(); initConnections(); } QOrderBookView::~QOrderBookView() { } void QOrderBookView::initUI() { QHBoxLayout *mainLayout = new QHBoxLayout(this); m_bidModel = new QStandardItemModel(this); m_bidModel->setColumnCount(3); m_bidModel->setHorizontalHeaderLabels({"价格", "数量", "订单数"}); m_bidView = new QTableView(this); m_bidView->setModel(m_bidModel); m_bidView->verticalHeader()->setVisible(false); m_bidView->setEditTriggers(QAbstractItemView::NoEditTriggers); m_bidView->setSelectionBehavior(QAbstractItemView::SelectRows); m_bidView->setSelectionMode(QAbstractItemView::SingleSelection); m_askModel = new QStandardItemModel(this); m_askModel->setColumnCount(3); m_askModel->setHorizontalHeaderLabels({"价格", "数量", "订单数"}); m_askView = new QTableView(this); m_askView->setModel(m_askModel); m_askView->verticalHeader()->setVisible(false); m_askView->setEditTriggers(QAbstractItemView::NoEditTriggers); m_askView->setSelectionBehavior(QAbstractItemView::SelectRows); m_askView->setSelectionMode(QAbstractItemView::SingleSelection); QVBoxLayout *bidLayout = new QVBoxLayout(); bidLayout->addWidget(new QLabel("买单", this)); bidLayout->addWidget(m_bidView); QVBoxLayout *askLayout = new QVBoxLayout(); askLayout->addWidget(new QLabel("卖单", this)); askLayout->addWidget(m_askView); mainLayout->addLayout(bidLayout); mainLayout->addLayout(askLayout); setLayout(mainLayout); } void QOrderBookView::initConnections() { auto manager = QOrderListManager::instance(); connect(manager, &QOrderListManager::orderBookChanged, this, &QOrderBookView::updateView); } void QOrderBookView::onOrderBookChanged() { updateView(); } void QOrderBookView::updateView() { updateBidView(); updateAskView(); } void QOrderBookView::updateBidView() { m_bidModel->removeRows(0, m_bidModel->rowCount()); auto bids = QOrderListManager::instance()->getBidPriceLevels(); int row = 0; for (auto it = bids.constBegin(); it != bids.constEnd(); ++it) { m_bidModel->insertRow(row); QStandardItem *priceItem = new QStandardItem(QString::number(it.key(), 'f', m_pricePrecision)); QStandardItem *volumeItem = new QStandardItem(QString::number(it.value(), 'f', m_volumePrecision)); int orderCount = 0; auto bidOrders = QOrderListManager::instance()->getBidOrders(); if (bidOrders.contains(it.key())) { orderCount = bidOrders.value(it.key()).size(); } QStandardItem *countItem = new QStandardItem(QString::number(orderCount)); m_bidModel->setItem(row, 0, priceItem); m_bidModel->setItem(row, 1, volumeItem); m_bidModel->setItem(row, 2, countItem); row++; } } void QOrderBookView::updateAskView() { m_askModel->removeRows(0, m_askModel->rowCount()); auto asks = QOrderListManager::instance()->getAskPriceLevels(); int row = 0; for (auto it = asks.constBegin(); it != asks.constEnd(); ++it) { m_askModel->insertRow(row); QStandardItem *priceItem = new QStandardItem(QString::number(it.key(), 'f', m_pricePrecision)); QStandardItem *volumeItem = new QStandardItem(QString::number(it.value(), 'f', m_volumePrecision)); int orderCount = 0; auto askOrders = QOrderListManager::instance()->getAskOrders(); if (askOrders.contains(it.key())) { orderCount = askOrders.value(it.key()).size(); } QStandardItem *countItem = new QStandardItem(QString::number(orderCount)); m_askModel->setItem(row, 0, priceItem); m_askModel->setItem(row, 1, volumeItem); m_askModel->setItem(row, 2, countItem); row++; } } void QOrderBookView::setPricePrecision(int precision) { m_pricePrecision = precision; updateView(); } void QOrderBookView::setVolumePrecision(int precision) { m_volumePrecision = precision; updateView(); } QOrderDetailView::QOrderDetailView(QWidget *parent) : QWidget(parent), m_orderType(QOrderListManager::BidOrder) { initUI(); initConnections(); } QOrderDetailView::~QOrderDetailView() { } void QOrderDetailView::initUI() { QVBoxLayout *mainLayout = new QVBoxLayout(this); m_detailModel = new QStandardItemModel(this); m_detailModel->setColumnCount(4); m_detailModel->setHorizontalHeaderLabels({"订单ID", "价格", "数量", "时间"}); m_detailView = new QTableView(this); m_detailView->setModel(m_detailModel); m_detailView->verticalHeader()->setVisible(false); m_detailView->setEditTriggers(QAbstractItemView::NoEditTriggers); m_detailView->setSelectionBehavior(QAbstractItemView::SelectRows); m_detailView->setSelectionMode(QAbstractItemView::SingleSelection); mainLayout->addWidget(m_detailView); setLayout(mainLayout); } void QOrderDetailView::initConnections() { auto manager = QOrderListManager::instance(); connect(manager, &QOrderListManager::orderBookChanged, this, &QOrderDetailView::updateView); connect(manager, &QOrderListManager::orderBookChanged, this, &QOrderDetailView::onOrderBookChanged); } void QOrderDetailView::onOrderBookChanged() { updateView(); } void QOrderDetailView::setOrderType(QOrderListManager::OrderType type) { m_orderType = type; updateView(); } void QOrderDetailView::updateView() { m_detailModel->removeRows(0, m_detailModel->rowCount()); auto manager = QOrderListManager::instance(); auto orders = (m_orderType == QOrderListManager::BidOrder) ? manager->getBidOrders() : manager->getAskOrders(); int row = 0; for (auto it = orders.constBegin(); it != orders.constEnd(); ++it) { for (const auto& order : it.value()) { m_detailModel->insertRow(row); QStandardItem *idItem = new QStandardItem(order->orderId); QStandardItem *priceItem = new QStandardItem(QString::number(order->price, 'f', 2)); QStandardItem *volumeItem = new QStandardItem(QString::number(order->volume, 'f', 4)); QStandardItem *timeItem = new QStandardItem(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); m_detailModel->setItem(row, 0, idItem); m_detailModel->setItem(row, 1, priceItem); m_detailModel->setItem(row, 2, volumeItem); m_detailModel->setItem(row, 3, timeItem); row++; } } }