update highlineview lastorder

This commit is contained in:
2025-08-31 23:07:06 +08:00
parent 4bf7977a30
commit 6ede3eff92
11 changed files with 145 additions and 36 deletions

View File

@@ -15,32 +15,14 @@
#include <QWidget>
#include <QCheckBox>
//// ==================== OrderTypeDelegate ====================
//OrderTypeDelegate::OrderTypeDelegate(QObject *parent)
// : QStyledItemDelegate(parent)
//{
//}
//
//void OrderTypeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
// const QModelIndex &index) const
//{
// if (!index.isValid()) return;
//
// QString type = index.data(Qt::DisplayRole).toString();
// if (type == "买入") {
// painter->fillRect(option.rect, QColor(255, 230, 230)); // 买入订单浅红背景
// } else if (type == "卖出") {
// painter->fillRect(option.rect, QColor(230, 255, 230)); // 卖出订单浅绿背景
// }
// QStyledItemDelegate::paint(painter, option, index);
//}
// ==================== QBigOrderViewer ====================
QBigOrderViewer::QBigOrderViewer(QWidget *parent)
: QWidget(parent),
m_model(new QStandardItemModel(0, 7, this)),
m_proxyModel(new QSortFilterProxyModel(this)),
m_typeDelegate(new OrderTypeDelegate(this))
m_typeDelegate(new OrderTypeDelegate(this)),
m_lastOrderDelegate(new HighlightDelegate(this))
{
initUI();
initConnections();
@@ -120,9 +102,12 @@ void QBigOrderViewer::initUI()
// m_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
m_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 默认按时间列第6列索引5升序排序
// 设置高亮委托到所有列
m_tableView->setItemDelegate(m_lastOrderDelegate);
// 默认按时间列第6列索引5升序排序 -> 新插入的行放在最顶上,故修改为降序排序 @2025.08.30 stone
const int timeColumnIndex = 6;
m_proxyModel->sort(timeColumnIndex, Qt::AscendingOrder);
m_proxyModel->sort(timeColumnIndex, Qt::DescendingOrder);
mainLayout->addWidget(m_tableView);
@@ -226,17 +211,60 @@ void QBigOrderViewer::applyFilters()
}
}
//void QBigOrderViewer::onBigOrderAdded(const BigOrderInfo &order)
//{
// auto newOrder = QSharedPointer<BigOrderInfo>::create(order);
// m_allOrders.append(newOrder);
// if (matchesFilter(newOrder)) {
// m_currentOrders.append(newOrder);
//
// // 高效插入单行
// int row = m_model->rowCount();
// m_model->insertRow(row);
// setRowData(row, newOrder);
// }
//}
void QBigOrderViewer::onBigOrderAdded(const BigOrderInfo &order)
{
auto newOrder = QSharedPointer<BigOrderInfo>::create(order);
m_allOrders.append(newOrder);
// 应用过滤条件
if (matchesFilter(newOrder)) {
m_currentOrders.append(newOrder);
// 高效插入单行
int row = m_model->rowCount();
// 在源模型的首行插入
int row = 0 ;
m_model->insertRow(row);
setRowData(row, newOrder);
// 设置高亮标记
for (int col = 0; col < m_model->columnCount(); ++col) {
QModelIndex index = m_model->index(row, col);
m_model->setData(index, true, IsHighlightedRole);
}
// 通知视图更新
QModelIndex topLeft = m_model->index(row, 0);
QModelIndex bottomRight = m_model->index(row, m_model->columnCount() - 1);
emit m_model->dataChanged(topLeft, bottomRight);
// 2秒后取消高亮
QTimer::singleShot(2000, this, [this, row]() {
for (int col = 0; col < m_model->columnCount(); ++col) {
QModelIndex index = m_model->index(row, col);
m_model->setData(index, false, IsHighlightedRole);
}
// 通知视图更新
QModelIndex topLeft = m_model->index(row, 0);
QModelIndex bottomRight = m_model->index(row, m_model->columnCount() - 1);
emit m_model->dataChanged(topLeft, bottomRight);
});
// 确保代理模型按时间降序排序,新数据在顶部
m_proxyModel->sort(6, Qt::DescendingOrder);
}
}
@@ -253,13 +281,26 @@ void QBigOrderViewer::setRowData(int row, QSharedPointer<BigOrderInfo> order)
QString::number(order->price, 'f', 2));
m_model->setData(m_model->index(row, 5),
QString::number(order->level));
QString str = order->svrRecvTime.mid(11);
if (str == nullptr)
{
QDateTime dateTime = QDateTime::currentDateTime();
str = dateTime.toString("hh:mm:ss");
// 确保时间格式正确,用于排序
QString timeStr;
if (order->svrRecvTime.length() >= 11) {
timeStr = order->svrRecvTime.mid(11);
}
m_model->setData(m_model->index(row, 6), str);
else {
QDateTime dateTime = QDateTime::currentDateTime();
timeStr = dateTime.toString("hh:mm:ss");
}
m_model->setData(m_model->index(row, 6), timeStr);
// 添加一个隐藏的时间戳列用于精确排序
QDateTime fullDateTime;
if (order->svrRecvTime.length() >= 19) {
fullDateTime = QDateTime::fromString(order->svrRecvTime.left(19), "yyyy-MM-dd hh:mm:ss");
}
else {
fullDateTime = QDateTime::currentDateTime();
}
m_model->setData(m_model->index(row, 6), fullDateTime, Qt::UserRole + 101); // 使用自定义角色存储完整时间戳
}
bool QBigOrderViewer::matchesFilter(QSharedPointer<BigOrderInfo> order)