diff --git a/QMainwindow/QBreathingLight.cpp b/QMainwindow/QBreathingLight.cpp new file mode 100644 index 0000000..de407e6 --- /dev/null +++ b/QMainwindow/QBreathingLight.cpp @@ -0,0 +1,86 @@ +#include "QBreathingLight.h" +#include +#include +#include + + +QBreathingLight::QBreathingLight(QWidget *parent) + : QWidget(parent) + , m_opacity(1.0f) + , m_isFlashing(false) + , m_flashColor(Qt::red) + , m_flashDuration(3000) // 默认闪烁3秒 +{ + // 设置固定大小 + setFixedSize(40, 40); + + // 连接定时器信号槽 + connect(&m_animationTimer, &QTimer::timeout, this, &QBreathingLight::updateAnimation); +} +void QBreathingLight::setFlashDuration(int milliseconds) +{ + m_flashDuration = milliseconds; +} + +void QBreathingLight::setFlashColor(const QColor &color) +{ + m_flashColor = color; +} + +void QBreathingLight::triggerSignal() +{ + if (!m_isFlashing) { + m_isFlashing = true; + m_flashStartTime = QTime::currentTime(); + m_animationTimer.start(30); // 30ms更新一次 + } +} + +void QBreathingLight::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + // 绘制背景 + painter.fillRect(rect(), QBrush(QColor(240, 240, 240))); + + // 计算中心点 + QPoint center = rect().center(); + int radius = qMin(width(), height()) / 3; + + // 根据状态设置颜色 + QColor color; + if (m_isFlashing) { + color = m_flashColor; + color.setAlphaF(m_opacity); + } + else { + color = Qt::green; // 未激活状态显示灰色 + } + + // 绘制呼吸灯 + painter.setBrush(QBrush(color)); + painter.setPen(Qt::NoPen); + painter.drawEllipse(center, radius, radius); +} + +void QBreathingLight::updateAnimation() +{ + // 检查是否超过闪烁持续时间 + int elapsed = m_flashStartTime.msecsTo(QTime::currentTime()); + if (elapsed >= m_flashDuration) { + m_isFlashing = false; + m_opacity = 1.0f; + m_animationTimer.stop(); + update(); + return; + } + + // 计算呼吸效果 (使用正弦函数实现平滑呼吸效果) + float progress = static_cast(elapsed) / m_flashDuration; + m_opacity = 0.5f * (1.0f + sin(progress * 2 * 3.14 * 5)); // 每秒闪烁2次 + + update(); // 触发重绘 +} \ No newline at end of file diff --git a/QMainwindow/QBreathingLight.h b/QMainwindow/QBreathingLight.h new file mode 100644 index 0000000..f0ce70c --- /dev/null +++ b/QMainwindow/QBreathingLight.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include +#include + +class QBreathingLight : public QWidget +{ + Q_OBJECT + +public: + explicit QBreathingLight(QWidget *parent = nullptr); + + // 设置闪烁参数 + void setFlashDuration(int milliseconds); // 设置闪烁总持续时间 + void setFlashColor(const QColor &color); // 设置闪烁颜色 + +public slots: + void triggerSignal(); // 触发信号,开始闪烁 + +protected: + void paintEvent(QPaintEvent *event) override; + +private slots: + void updateAnimation(); + +private: + float m_opacity; // 当前透明度 + bool m_isFlashing; // 是否正在闪烁 + QTimer m_animationTimer; // 动画定时器 + QColor m_flashColor; // 闪烁颜色 + QTime m_flashStartTime; // 闪烁开始时间 + int m_flashDuration; // 闪烁持续时间(毫秒) +}; diff --git a/QMainwindow/QMainwindow.cpp b/QMainwindow/QMainwindow.cpp index 22c2699..6eb1dff 100644 --- a/QMainwindow/QMainwindow.cpp +++ b/QMainwindow/QMainwindow.cpp @@ -79,6 +79,18 @@ QMainwindow::QMainwindow(QWidget *parent) }, Qt::QueuedConnection // 必须使用跨线程连接 ); + + auto manager = QBigOrderManager::instance(); + QObject::connect( + manager, + &QBigOrderManager::markBigOrderSignal, + this, + [this]() { + m_lightWidget->triggerSignal(); + + }, Qt::QueuedConnection // 必须使用跨线程连接 + ); + // 检查对象有效性 if (!m_dataAcquisition || !m_dataAcquisition->m_InterfaceFutu) { qCritical() << "Invalid data acquisition or interface"; @@ -255,6 +267,17 @@ void QMainwindow::initWidget() // } //}); + // 创建呼吸灯控件 + m_lightWidget = new QBreathingLight(); + ui.layoutBreathing->addWidget(m_lightWidget, 0, Qt::AlignCenter); + + //// 创建自动测试定时器 + //QTimer *autoTestTimer = new QTimer(this); + //connect(autoTestTimer, &QTimer::timeout, m_lightWidget, &QBreathingLight::triggerSignal); + //autoTestTimer->start(2000); // 每2秒自动触发一次 + + //connect(ui.btnConnOpend, &QPushButton::clicked, m_lightWidget, &QBreathingLight::triggerSignal); + } void QMainwindow::initReplyManage() diff --git a/QMainwindow/QMainwindow.h b/QMainwindow/QMainwindow.h index f4a9d1c..a0edec7 100644 --- a/QMainwindow/QMainwindow.h +++ b/QMainwindow/QMainwindow.h @@ -11,6 +11,7 @@ #include "ui_QMainwindow.h" #include "QDataAcquisition.h" +#include "QBreathingLight.h" #include "..\Sqbase\qlogmanager.h" #include "..\Sqbase\qlogviewer.h" @@ -34,6 +35,8 @@ private: QDataAcquisition* m_dataAcquisition; QTimer* m_netCheckTimer; + QBreathingLight *m_lightWidget; + public: void initWidget(); diff --git a/QMainwindow/QMainwindow.ui b/QMainwindow/QMainwindow.ui index 9986d43..e667b65 100644 --- a/QMainwindow/QMainwindow.ui +++ b/QMainwindow/QMainwindow.ui @@ -42,6 +42,40 @@ + + + + + 40 + 40 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + + + diff --git a/QMainwindow/QMainwindow.vcxproj b/QMainwindow/QMainwindow.vcxproj index e9ea1d1..d283513 100644 --- a/QMainwindow/QMainwindow.vcxproj +++ b/QMainwindow/QMainwindow.vcxproj @@ -111,6 +111,7 @@ + @@ -127,6 +128,7 @@ + diff --git a/QMainwindow/QMainwindow.vcxproj.filters b/QMainwindow/QMainwindow.vcxproj.filters index 7f9aac5..e863f70 100644 --- a/QMainwindow/QMainwindow.vcxproj.filters +++ b/QMainwindow/QMainwindow.vcxproj.filters @@ -76,6 +76,9 @@ Source Files + + Source Files + @@ -122,6 +125,9 @@ Header Files + + Header Files + diff --git a/QTradeProgram.VC.db b/QTradeProgram.VC.db index 378208a..a26d33c 100644 Binary files a/QTradeProgram.VC.db and b/QTradeProgram.VC.db differ diff --git a/QTradeProgram.rar b/QTradeProgram.rar deleted file mode 100644 index 283bf4f..0000000 Binary files a/QTradeProgram.rar and /dev/null differ diff --git a/Sqbase/qbigordermanager.cpp b/Sqbase/qbigordermanager.cpp index 0160714..90f948d 100644 --- a/Sqbase/qbigordermanager.cpp +++ b/Sqbase/qbigordermanager.cpp @@ -72,6 +72,8 @@ bool QBigOrderManager::addBigOrder(const BigOrderInfo &order) locker.unlock(); // 先解锁再发信号 emit bigOrderAdded(order); + emit markBigOrderSignal(); + return true; } diff --git a/Sqbase/qbigordermanager.h b/Sqbase/qbigordermanager.h index e6fc881..115b2c2 100644 --- a/Sqbase/qbigordermanager.h +++ b/Sqbase/qbigordermanager.h @@ -38,6 +38,8 @@ signals: //void bigOrdersUpdated(); void saveOverRefreshView(); + void markBigOrderSignal(); + protected: explicit QBigOrderManager(QObject *parent = nullptr); ~QBigOrderManager(); diff --git a/Sqbase/qbigorderviewer.cpp b/Sqbase/qbigorderviewer.cpp index 9cafc53..9fd5fa5 100644 --- a/Sqbase/qbigorderviewer.cpp +++ b/Sqbase/qbigorderviewer.cpp @@ -197,7 +197,13 @@ void QBigOrderViewer::updateView() rowItems << new QStandardItem(QString::number(std::fabs(order->volume/1000)) + "K"); rowItems << new QStandardItem(QString::number(order->price, 'f', 2)); rowItems << new QStandardItem(QString::number(order->level)); - rowItems << new QStandardItem(order->svrRecvTime.mid(12)); + QString str = order->svrRecvTime.mid(11); + if (str == nullptr) + { + QDateTime dateTime = QDateTime::currentDateTime(); + str = dateTime.toString("hh:mm:ss"); + } + rowItems << new QStandardItem(str); m_model->appendRow(rowItems); } } @@ -247,7 +253,13 @@ void QBigOrderViewer::setRowData(int row, QSharedPointer order) QString::number(order->price, 'f', 2)); m_model->setData(m_model->index(row, 5), QString::number(order->level)); - m_model->setData(m_model->index(row, 6), order->svrRecvTime); + QString str = order->svrRecvTime.mid(11); + if (str == nullptr) + { + QDateTime dateTime = QDateTime::currentDateTime(); + str = dateTime.toString("hh:mm:ss"); + } + m_model->setData(m_model->index(row, 6), str); } bool QBigOrderViewer::matchesFilter(QSharedPointer order) diff --git a/Sqbase/qhistoryorderdialog.cpp b/Sqbase/qhistoryorderdialog.cpp index a3ab754..1e78778 100644 --- a/Sqbase/qhistoryorderdialog.cpp +++ b/Sqbase/qhistoryorderdialog.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -121,7 +122,13 @@ void QHistoryOrderDialog::loadOrdersForDate(const QDate &date) rowItems << new QStandardItem(QString::number(std::fabs(order->volume / 1000)) + "K"); rowItems << new QStandardItem(QString::number(order->price, 'f', 2)); rowItems << new QStandardItem(QString::number(order->level)); - rowItems << new QStandardItem(order->svrRecvTime.mid(12)); + QString str = order->svrRecvTime.mid(11); + if (str == nullptr) + { + QDateTime dateTime = QDateTime::currentDateTime(); + str = dateTime.toString("hh:mm:ss"); + } + rowItems << new QStandardItem(str); m_model->appendRow(rowItems); } diff --git a/Sqbase/qorderprocessor.cpp b/Sqbase/qorderprocessor.cpp index 60e8e75..295da63 100644 --- a/Sqbase/qorderprocessor.cpp +++ b/Sqbase/qorderprocessor.cpp @@ -92,10 +92,9 @@ QVector QOrderProcessor::findMaxVolumeItem(const OrderBookData & d for (int i = 0; i < items.size(); i++) { // 鍚屼竴涓环鏍兼尅浣嶇殑璁㈠崟涓偂绁ㄦ暟閲忓ぇ浜庯紝闃堝兼墠鏈夊彲鑳芥槸澶у崟 if (volume < items[i].volume) { - for (int j = 0; j< items[i].orderCount; j++) + for (int j = 0; j< items[i].details.size(); j++) // 瓒呰繃list鐨勬渶澶ф暟閲忥紝灏变笉浼氳繑鍥炴暟鎹簡 { try { - if (items[i].details.size() == 0) continue; if (volume < items[i].details[j].volume) { findBigOrder = true; @@ -124,10 +123,9 @@ QVector QOrderProcessor::findMaxVolumeItem(const OrderBookData & d for (int i = 0; i < items.size(); i++) { // 鍚屼竴涓环鏍兼尅浣嶇殑璁㈠崟涓偂绁ㄦ暟閲忓ぇ浜庯紝闃堝兼墠鏈夊彲鑳芥槸澶у崟 if (volume < items[i].volume) { - for (int j = 0; j< items[i].orderCount; j++) + for (int j = 0; j< items[i].details.size(); j++) { try { - if (items[i].details.size() == 0) continue; if (volume < items[i].details[j].volume) { findBigOrder = true; diff --git a/config/replyCodeList.csv b/config/replyCodeList.csv index 4ca50b9..8d50b0c 100644 --- a/config/replyCodeList.csv +++ b/config/replyCodeList.csv @@ -1,8 +1,9 @@ 股票代码,检测阈值 09885,200000 -00581,700000 +00581,300000 03383,800000 02666,500000 00839,500000 06098,600000 06865,150000 +00700,10000