173 lines
6.5 KiB
C++
173 lines
6.5 KiB
C++
#include "QOrderListViewer.h"
|
|
#include <QHeaderView>
|
|
#include <QHBoxLayout>
|
|
#include <QVBoxLayout>
|
|
#include <QLabel>
|
|
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++;
|
|
}
|
|
}
|
|
} |