Files
QTradeProgram/cleaned_source_code/Sqbase/qorderlistviewer.cpp

173 lines
6.5 KiB
C++
Raw Normal View History

2026-02-25 23:01:42 +08:00
#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++;
}
}
}