update highlineview lastorder
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user