470 lines
13 KiB
C++
470 lines
13 KiB
C++
|
|
#pragma execution_character_set("utf-8")
|
|||
|
|
|
|||
|
|
#include "QMainwindow.h"
|
|||
|
|
#include <QSettings>
|
|||
|
|
#include <QFile>
|
|||
|
|
#include <QTextStream>
|
|||
|
|
|
|||
|
|
#include <QTimer>
|
|||
|
|
//#include <QMessageBox>
|
|||
|
|
|
|||
|
|
#include <QDebug>
|
|||
|
|
|
|||
|
|
QMainwindow::QMainwindow(QWidget *parent)
|
|||
|
|
: QMainWindow(parent)
|
|||
|
|
{
|
|||
|
|
ui.setupUi(this);
|
|||
|
|
|
|||
|
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
QLogManager::getInstance()->setLogLevel(QLogManager::SQ_INFO);;
|
|||
|
|
|
|||
|
|
m_nReplyCount = 0;
|
|||
|
|
|
|||
|
|
m_dataAcquisition = new QDataAcquisition;
|
|||
|
|
|
|||
|
|
m_netCheckTimer = new QTimer(this);
|
|||
|
|
m_netCheckTimer->start(1000); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1000<30><30><EFBFBD>루1<EBA3A8>룩
|
|||
|
|
connect(m_netCheckTimer, &QTimer::timeout, this, [=]() {
|
|||
|
|
if (m_dataAcquisition->m_InterfaceFutu->bConnected)
|
|||
|
|
ui.lblNetStatu->setStyleSheet("background-color: green;");
|
|||
|
|
else
|
|||
|
|
ui.lblNetStatu->setStyleSheet("background-color: red;");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
initWidget();
|
|||
|
|
initReplyManage();
|
|||
|
|
|
|||
|
|
// <20><>־<EFBFBD>鿴<EFBFBD><E9BFB4><EFBFBD><EFBFBD>ǩҳ
|
|||
|
|
logViewer = new QLogViewer;
|
|||
|
|
//tabWidget->addTab(logViewer, "System Logs");
|
|||
|
|
|
|||
|
|
ui.verticalLayout_9->addWidget(logViewer);
|
|||
|
|
|
|||
|
|
LOG_INFO("Start Programm!");
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>鿴<EFBFBD><E9BFB4>
|
|||
|
|
QBigOrderViewer* viewer = new QBigOrderViewer();
|
|||
|
|
ui.layoutBigorderViewer->addWidget(viewer);
|
|||
|
|
QObject::connect(
|
|||
|
|
viewer,
|
|||
|
|
&QBigOrderViewer::sendStockCodeToMainForm,
|
|||
|
|
this,
|
|||
|
|
[this](const QString& code) {
|
|||
|
|
int nIdex = 0;
|
|||
|
|
for (const auto& item : m_replyCodes) {
|
|||
|
|
if (item->stockCode == code)
|
|||
|
|
break;
|
|||
|
|
nIdex++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (nIdex < 0 || nIdex >= m_model->rowCount()) return;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰѡ<C7B0><D1A1>
|
|||
|
|
ui.tableReplylist->clearSelection();
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>
|
|||
|
|
QModelIndex topLeft = m_model->index(nIdex, 0);
|
|||
|
|
QModelIndex bottomRight = m_model->index(nIdex, m_model->columnCount() - 1);
|
|||
|
|
QItemSelection selection(topLeft, bottomRight);
|
|||
|
|
|
|||
|
|
// Ӧ<><D3A6>ѡ<EFBFBD><D1A1>
|
|||
|
|
ui.tableReplylist->selectionModel()->select(selection, QItemSelectionModel::Select);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>
|
|||
|
|
ui.tableReplylist->scrollTo(m_model->index(nIdex, 0), QAbstractItemView::PositionAtTop);
|
|||
|
|
//ui.tableReplylist->scrollTo(topLeft, QAbstractItemView::PositionAtCenter);
|
|||
|
|
ui.tableReplylist->update();
|
|||
|
|
|
|||
|
|
}, Qt::QueuedConnection // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ÿ<EFBFBD><C3BF>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
|||
|
|
if (!m_dataAcquisition || !m_dataAcquisition->m_InterfaceFutu) {
|
|||
|
|
qCritical() << "Invalid data acquisition or interface";
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
auto* processor = &m_dataAcquisition->m_InterfaceFutu->processor;
|
|||
|
|
// <20><><EFBFBD><EFBFBD> maxAskOrderReady <20>ź<EFBFBD>
|
|||
|
|
bool askConnected = QObject::connect(
|
|||
|
|
processor,
|
|||
|
|
&QOrderProcessor::maxOrderReady,
|
|||
|
|
this,
|
|||
|
|
[this](BigOrderInfo bigOrderInfo) {
|
|||
|
|
|
|||
|
|
if (auto manager = QBigOrderManager::instance()) {
|
|||
|
|
if (!manager->addBigOrder(bigOrderInfo))
|
|||
|
|
;// LOG_WARNING("Failed to add order");
|
|||
|
|
}
|
|||
|
|
},Qt::QueuedConnection // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ÿ<EFBFBD><C3BF>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
//bool bidConnected = QObject::connect(
|
|||
|
|
// processor,
|
|||
|
|
// &QOrderProcessor::maxBidOrderReady,
|
|||
|
|
// this,
|
|||
|
|
// [this](BigOrderInfo bigOrderInfo) {
|
|||
|
|
|
|||
|
|
// BigOrderItem order;
|
|||
|
|
// order.stockCode = bigOrderInfo.code;
|
|||
|
|
// order.stockName = bigOrderInfo.name;
|
|||
|
|
// order.orderPrice = bigOrderInfo.price;
|
|||
|
|
// order.stockQuantity = bigOrderInfo.volume;
|
|||
|
|
// order.orderCount = 1;
|
|||
|
|
// order.orderType = "BID";
|
|||
|
|
// order.orderTime = QDateTime::currentDateTime(); // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>仹<EFBFBD><E4BBB9>ȷ<D7BC><C8B7>Ӧ<EFBFBD><D3A6><EFBFBD>ǽ<EFBFBD><C7BD>յ<EFBFBD><D5B5><EFBFBD>ϵͳʱ<CDB3><CAB1>
|
|||
|
|
|
|||
|
|
// if (auto manager = QBigOrderManager::instance()) {
|
|||
|
|
// if (!manager->addBigOrder(order))
|
|||
|
|
// LOG_WARNING("Failed to add order");
|
|||
|
|
// }
|
|||
|
|
// }, Qt::QueuedConnection // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ÿ<EFBFBD><C3BF>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
ִ<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
- <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
QObject::connect(ui.btnDoReply, &QPushButton::clicked, [this]() {
|
|||
|
|
m_nReplyCount = m_setReplayCode.size();
|
|||
|
|
LOG_INFO("Start Reply!");
|
|||
|
|
|
|||
|
|
ui.btnDoReply->setText("<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD> ...");
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>źŵķ<C5B5>ʽ<EFBFBD><CABD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
|
|||
|
|
|
|||
|
|
// ɸѡ<C9B8><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|||
|
|
m_dataAcquisition->m_InterfaceFutu->processor.setreplyCodeQuantity(m_replyCodeQuantity);
|
|||
|
|
m_dataAcquisition->m_InterfaceFutu->subStock();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
<EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OpenD
|
|||
|
|
*/
|
|||
|
|
QObject::connect(ui.btnConnOpend, &QPushButton::clicked, [this]() {
|
|||
|
|
if (!m_dataAcquisition->m_InterfaceFutu->bConnected)
|
|||
|
|
m_dataAcquisition->m_InterfaceFutu->InitConn();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QMainwindow::~QMainwindow()
|
|||
|
|
{
|
|||
|
|
if (m_dataAcquisition)
|
|||
|
|
{
|
|||
|
|
delete m_dataAcquisition;
|
|||
|
|
m_dataAcquisition = NULL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void QMainwindow::initWidget()
|
|||
|
|
{
|
|||
|
|
m_model = new QStandardItemModel(0, 2, this);
|
|||
|
|
//m_model->setEditable(true);
|
|||
|
|
m_proxyModel = new QSortFilterProxyModel(this);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|||
|
|
m_proxyModel->setSourceModel(m_model);
|
|||
|
|
ui.tableReplylist->setModel(m_proxyModel);
|
|||
|
|
//ui.tableReplylist->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
|||
|
|
|
|||
|
|
ui.tableReplylist->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|||
|
|
ui.tableReplylist->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
|||
|
|
//ui.tableReplylist->setEditTriggers(QAbstractItemView::EditTriggers);
|
|||
|
|
// <20><><EFBFBD>ñ<EFBFBD>ͷ
|
|||
|
|
m_model->setHorizontalHeaderLabels(
|
|||
|
|
QStringList() << "<EFBFBD><EFBFBD>Ʊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ");
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵʱ<EFBFBD><EFBFBD>ͬʱ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
QObject::connect(m_model, &QStandardItemModel::dataChanged,
|
|||
|
|
[&](const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) {
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>仯<EFBFBD><E4BBAF><EFBFBD><EFBFBD>
|
|||
|
|
for (int row = topLeft.row(); row <= bottomRight.row(); ++row) {
|
|||
|
|
for (int col = topLeft.column(); col <= bottomRight.column(); ++col) {
|
|||
|
|
QModelIndex index = m_model->index(row, col);
|
|||
|
|
QString newData = m_model->data(index, Qt::DisplayRole).toString();
|
|||
|
|
|
|||
|
|
m_replyCodes.at(row)->stockQuantityTh = newData.mid(0, newData.size() - 2).toFloat() * 1000;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
QObject::connect(ui.tableReplylist->selectionModel(), &QItemSelectionModel::selectionChanged,
|
|||
|
|
|
|||
|
|
[&](const QItemSelection &selected, const QItemSelection &deselected) {
|
|||
|
|
|
|||
|
|
Q_UNUSED(deselected); // δʹ<CEB4><CAB9>deselected<65><64><EFBFBD><EFBFBD><EFBFBD>⾯<EFBFBD><E2BEAF>
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰѡ<C7B0>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
QModelIndexList selectedIndexes = ui.tableReplylist->selectionModel()->selectedIndexes();
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ѡ<EFBFBD><D1A1><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>
|
|||
|
|
if (selectedIndexes.isEmpty()) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// <20><>ȡѡ<C8A1>е<EFBFBD><D0B5>кţ<D0BA>ȥ<EFBFBD>أ<EFBFBD>
|
|||
|
|
int selectedRow = selectedIndexes.at(0).row();
|
|||
|
|
ui.editInputCode->setText(m_replyCodes.at(selectedRow)->stockCode);
|
|||
|
|
ui.editQuantityTh->setText(QString::number(m_replyCodes.at(selectedRow)->stockQuantityTh / 1000,'f',1));
|
|||
|
|
});
|
|||
|
|
//ui.listAsk->setAlternatingRowColors(true);
|
|||
|
|
//ui.listAsk->setStyleSheet(
|
|||
|
|
// "QListWidget::item[latest=true] {"
|
|||
|
|
// " background-color: #ffcccc;" // <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>ɫ
|
|||
|
|
// "}"
|
|||
|
|
// "QListWidget::item {"
|
|||
|
|
// " background-color: white;" // Ĭ<><C4AC><EFBFBD>е<EFBFBD><D0B5><EFBFBD>ɫ
|
|||
|
|
// "}"
|
|||
|
|
//);
|
|||
|
|
//ui.listBid->setAlternatingRowColors(true);
|
|||
|
|
//ui.listBid->setStyleSheet(
|
|||
|
|
// "QListWidget::item[latest=true] {"
|
|||
|
|
// " background-color: #ffcccc;" // <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>ɫ
|
|||
|
|
// "}"
|
|||
|
|
// "QListWidget::item {"
|
|||
|
|
// " background-color: white;" // Ĭ<><C4AC><EFBFBD>е<EFBFBD><D0B5><EFBFBD>ɫ
|
|||
|
|
// "}"
|
|||
|
|
//);
|
|||
|
|
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//connect(ui.listAsk, &QListWidget::itemChanged, [=]() {
|
|||
|
|
// if (ui.listAsk->count() > 0) {
|
|||
|
|
// // <20><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
|
|||
|
|
// for (int i = 0; i < ui.listAsk->count(); ++i) {
|
|||
|
|
// ui.listAsk->item(i)->setData(Qt::UserRole, QVariant());
|
|||
|
|
// }
|
|||
|
|
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// ui.listAsk->item(ui.listAsk->count() - 1)->setData(Qt::UserRole, "latest");
|
|||
|
|
// }
|
|||
|
|
//});
|
|||
|
|
|
|||
|
|
//connect(ui.listBid, &QListWidget::itemChanged, [=]() {
|
|||
|
|
// if (ui.listAsk->count() > 0) {
|
|||
|
|
// // <20><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
|
|||
|
|
// for (int i = 0; i < ui.listAsk->count(); ++i) {
|
|||
|
|
// ui.listBid->item(i)->setData(Qt::UserRole, QVariant());
|
|||
|
|
// }
|
|||
|
|
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// ui.listAsk->item(ui.listBid->count() - 1)->setData(Qt::UserRole, "latest");
|
|||
|
|
// }
|
|||
|
|
//});
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QMainwindow::initReplyManage()
|
|||
|
|
{
|
|||
|
|
// <20><>ȡĬ<C8A1>϶<EFBFBD><CFB6>Ĺ<EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|||
|
|
readReplyCodefile(m_replyCodes);
|
|||
|
|
LOG_INFO("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD>سɹ<EFBFBD>!");
|
|||
|
|
|
|||
|
|
m_dataAcquisition->m_InterfaceFutu->setReplyList(m_replyCodes);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
QIntValidator *intValidator = new QIntValidator(1, 99999, this);
|
|||
|
|
ui.editInputCode->setValidator(intValidator);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>/<2F>Ķ<DEB8><C4B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
QObject::connect(ui.btnAddCode, &QPushButton::clicked, [=]()
|
|||
|
|
{
|
|||
|
|
ReplyCodeItem order;
|
|||
|
|
order.stockCode = toFixedDigitNumber(ui.editInputCode->text());
|
|||
|
|
order.stockQuantityTh = ui.editQuantityTh->text().toFloat() * 1000;
|
|||
|
|
|
|||
|
|
bool bFinded = false;
|
|||
|
|
for (const auto& item : m_replyCodes) {
|
|||
|
|
if (item->stockCode == order.stockCode)
|
|||
|
|
{
|
|||
|
|
item->stockQuantityTh = order.stockQuantityTh;
|
|||
|
|
m_replyCodeQuantity[item->stockCode] = order.stockQuantityTh;
|
|||
|
|
bFinded = true;
|
|||
|
|
|
|||
|
|
LOG_INFO("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>룺" + order.stockCode + " ,<2C><>ֵ<EFBFBD><D6B5>"+QString::number(order.stockQuantityTh));
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!bFinded)
|
|||
|
|
{
|
|||
|
|
if (m_replyCodes.size() + 1 > 50)
|
|||
|
|
{
|
|||
|
|
LOG_WARNING("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
auto newOrder = QSharedPointer<ReplyCodeItem>::create(order);
|
|||
|
|
m_replyCodes.append(newOrder);
|
|||
|
|
|
|||
|
|
m_replyCodeQuantity.insert(order.stockCode, order.stockQuantityTh);
|
|||
|
|
|
|||
|
|
LOG_INFO("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>룺" + order.stockCode + " ,<2C><>ֵ<EFBFBD><D6B5>" + QString::number(order.stockQuantityTh));
|
|||
|
|
}
|
|||
|
|
updateCodeTable();
|
|||
|
|
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// ɾ<><C9BE>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
QObject::connect(ui.btnDeleteCode, &QPushButton::clicked, [=]() {
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ѡ<EFBFBD>е<EFBFBD><D0B5><EFBFBD>
|
|||
|
|
QModelIndexList selected = ui.tableReplylist->selectionModel()->selectedRows();
|
|||
|
|
// ɾ<><C9BE>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>
|
|||
|
|
for (int i = selected.size() - 1; i >= 0; --i) {
|
|||
|
|
m_replyCodes.removeAt(selected[i].row());
|
|||
|
|
m_replyCodeQuantity.remove(toFixedDigitNumber(ui.editInputCode->text()));
|
|||
|
|
}
|
|||
|
|
updateCodeTable();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
QObject::connect(ui.btnSaveCodefile, &QPushButton::clicked, [=]() {
|
|||
|
|
saveReplyCodefile();
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
m_dataAcquisition->m_InterfaceFutu->processor.setreplyCodeQuantity(m_replyCodeQuantity);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QMainwindow::updateCodeTable()
|
|||
|
|
{
|
|||
|
|
m_model->removeRows(0, m_model->rowCount());
|
|||
|
|
for (const auto& order : m_replyCodes) {
|
|||
|
|
QList<QStandardItem*> rowItems;
|
|||
|
|
rowItems << new QStandardItem(order->stockCode);
|
|||
|
|
rowItems << new QStandardItem(QString::number(order->stockQuantityTh/1000, 'f', 1) + "K");
|
|||
|
|
m_model->appendRow(rowItems);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>鲢<EFBFBD><E9B2A2>ʽ<EFBFBD><CABD>Ϊ5λ<35><CEBB><EFBFBD><EFBFBD>
|
|||
|
|
QString QMainwindow::toFixedDigitNumber(const QString& input) {
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ȫΪ0-9<><39><EFBFBD><EFBFBD>
|
|||
|
|
QRegularExpression re("^\\d+$");
|
|||
|
|
if (!re.match(input).hasMatch()) {
|
|||
|
|
return QString(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>code <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ʱ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD> <20><>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
|
|||
|
|
if (input.length() > 5) {
|
|||
|
|
return input.right(5); // <20><><EFBFBD><EFBFBD>5λ<35><CEBB><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>5λ
|
|||
|
|
}
|
|||
|
|
else if (input.length() < 5) {
|
|||
|
|
return QString("%1").arg(input, 5, '0'); // <20><><EFBFBD><EFBFBD>5λ<35><CEBB><EFBFBD><EFBFBD><EFBFBD>ಹ0
|
|||
|
|
}
|
|||
|
|
return input; // <20><><EFBFBD><EFBFBD>5λ<35><CEBB>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void QMainwindow::readReplyCodefile(QList<QSharedPointer<ReplyCodeItem>>& replyList)
|
|||
|
|
{
|
|||
|
|
QString appDir = QCoreApplication::applicationDirPath();
|
|||
|
|
QString fileName = QDir(appDir).absoluteFilePath("../../config/replyCodeList.csv");
|
|||
|
|
QFile file(fileName);
|
|||
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|||
|
|
LOG_FATAL("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QTextStream in(&file);
|
|||
|
|
in.setCodec("UTF-8"); // <20><><EFBFBD>ñ<EFBFBD><C3B1>룬ȷ<EBA3AC><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
replyList.clear(); // <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
m_replyCodeQuantity.clear();
|
|||
|
|
|
|||
|
|
bool isFirstLine = true;
|
|||
|
|
while (!in.atEnd()) {
|
|||
|
|
QString line = in.readLine();
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (line.trimmed().isEmpty()) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>DZ<EFBFBD><C7B1>⣩
|
|||
|
|
if (isFirstLine) {
|
|||
|
|
isFirstLine = false;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>CSV<53><56>
|
|||
|
|
QStringList fields = line.split(',');
|
|||
|
|
|
|||
|
|
|
|||
|
|
// ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD><E3B9BB><EFBFBD>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CSV<53>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (/*fields.size() >= 3*/1) {
|
|||
|
|
QString code = fields[0].trimmed();
|
|||
|
|
QString description = fields[1].trimmed();
|
|||
|
|
//bool isActive = fields[2].trimmed().toLower() == "true" || fields[2].trimmed() == "1";
|
|||
|
|
ReplyCodeItem replyItem;
|
|||
|
|
replyItem.stockCode = toFixedDigitNumber(code);
|
|||
|
|
replyItem.stockQuantityTh = description.toFloat();
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ReplyCodeItem<65><6D><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>б<EFBFBD>
|
|||
|
|
auto item = QSharedPointer<ReplyCodeItem>::create(replyItem);
|
|||
|
|
m_replyCodes.append(item);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>浽ӳ<E6B5BD><D3B3><EFBFBD><EFBFBD>
|
|||
|
|
m_replyCodeQuantity.insert(replyItem.stockCode, replyItem.stockQuantityTh);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
//qWarning() << "<22><><EFBFBD>Ը<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>:" << line;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
file.close();
|
|||
|
|
updateCodeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>涩<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void QMainwindow::saveReplyCodefile()
|
|||
|
|
{
|
|||
|
|
//// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
|
QString appDir = QCoreApplication::applicationDirPath();
|
|||
|
|
QString fileName = QDir(appDir).absoluteFilePath("../../config/replyCodeList.csv");
|
|||
|
|
|
|||
|
|
QFile file(fileName);
|
|||
|
|
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
|||
|
|
LOG_FATAL("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>" );
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QTextStream out(&file);
|
|||
|
|
out.setCodec("GBK"); // ȷ<><C8B7>ʹ<EFBFBD><CAB9>UTF-8<><38><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
// д<><D0B4><EFBFBD><EFBFBD>ͷ
|
|||
|
|
for (int col = 0; col < m_model->columnCount(); ++col) {
|
|||
|
|
out << escapeCsv(m_model->headerData(col, Qt::Horizontal).toString());
|
|||
|
|
if (col < m_model->columnCount() - 1) out << ",";
|
|||
|
|
}
|
|||
|
|
out << "\n";
|
|||
|
|
// д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (const auto &value : m_replyCodes) {
|
|||
|
|
out << value->stockCode<<","<< value->stockQuantityTh << "\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
file.close();
|
|||
|
|
|
|||
|
|
LOG_INFO("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>!");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QString QMainwindow::escapeCsv(const QString &field) {
|
|||
|
|
if (field.contains(',') || field.contains('"') || field.contains('\n')) {
|
|||
|
|
QString escaped = field;
|
|||
|
|
escaped.replace("\"", "\"\"");
|
|||
|
|
return "\"" + escaped + "\"";
|
|||
|
|
}
|
|||
|
|
return field;
|
|||
|
|
}
|