Files
QTradeProgram/QMainwindow/QMainwindow.cpp

493 lines
13 KiB
C++
Raw Normal View History

2025-08-15 15:56:40 +08:00
#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>
);
2025-08-22 10:59:38 +08:00
auto manager = QBigOrderManager::instance();
QObject::connect(
manager,
&QBigOrderManager::markBigOrderSignal,
this,
[this]() {
m_lightWidget->triggerSignal();
}, Qt::QueuedConnection // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ÿ<EFBFBD><C3BF>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>
);
2025-08-15 15:56:40 +08:00
// <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");
// }
//});
2025-08-22 10:59:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿؼ<C6BF>
m_lightWidget = new QBreathingLight();
ui.layoutBreathing->addWidget(m_lightWidget, 0, Qt::AlignCenter);
//// <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Զ<EFBFBD>ʱ<EFBFBD><CAB1>
//QTimer *autoTestTimer = new QTimer(this);
//connect(autoTestTimer, &QTimer::timeout, m_lightWidget, &QBreathingLight::triggerSignal);
//autoTestTimer->start(2000); // ÿ2<C3BF><32><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//connect(ui.btnConnOpend, &QPushButton::clicked, m_lightWidget, &QBreathingLight::triggerSignal);
2025-08-15 15:56:40 +08:00
}
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><35><CEBB><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
}
else if (input.length() < 5) {
return QString("%1").arg(input, 5, '0'); // <20><><EFBFBD><EFBFBD><35><CEBB><EFBFBD><EFBFBD><EFBFBD>ಹ0
}
return input; // <20><><EFBFBD><EFBFBD><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;
}