From 6c68684bcdc55572de4084d7b4bc97ed20ffc68c Mon Sep 17 00:00:00 2001
From: wumu <mayi@mayi.com>
Date: 星期三, 08 一月 2025 22:49:23 +0800
Subject: [PATCH] 251008

---
 leadingcompany.ui    |  117 ++++
 main.cpp             |   11 
 leadingcompany.cpp   |   46 +
 getstocklist.h       |   85 +++
 stockpolicy.ui       |   24 +
 stock_plan.pro       |   46 +
 stockpolicy.cpp      |   95 +++
 README.md            |    2 
 showinfomessage.ui   |   37 +
 clientmainwindow.h   |   34 +
 showinfomessage.h    |   24 +
 clientmainwindow.cpp |   44 +
 clientmainwindow.ui  |   60 ++
 getstocklist.cpp     |  635 ++++++++++++++++++++++++++
 leadingcompany.h     |   29 +
 showinfomessage.cpp  |   19 
 stockpolicy.h        |   41 +
 getstocklist.ui      |   62 ++
 18 files changed, 1,410 insertions(+), 1 deletions(-)

diff --git a/README.md b/README.md
index 1dfb014..648083f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
 ## stock_plan
 
-閲忓寲
+鑲$エ鐩稿叧鐨勭埇鍙栥�佸垎鏋愩�佺瓥鐣ョ瓑 2023-07-07
 
diff --git a/clientmainwindow.cpp b/clientmainwindow.cpp
new file mode 100644
index 0000000..3c4e54b
--- /dev/null
+++ b/clientmainwindow.cpp
@@ -0,0 +1,44 @@
+锘�#include "clientmainwindow.h"
+#include "ui_clientmainwindow.h"
+
+
+ClientMainWindow::ClientMainWindow(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::ClientMainWindow)
+{
+    ui->setupUi(this);
+    // 鍚姩鐣岄潰鍒濆鍖栫殑鍑芥暟
+    initUi();
+
+}
+
+ClientMainWindow::~ClientMainWindow()
+{
+    delete ui;
+}
+
+void ClientMainWindow::initUi()
+{
+    ui->tabWidget->clear(); // 娓呴櫎鏃犵敤鐨勫墠2涓猼ab椤甸潰
+
+    // 瀹炰緥鍖栬幏鍙栬偂绁ㄥ垪琛ㄧ殑鐣岄潰瀵硅薄
+    m_getStockList = new GetStockList(this);
+    // 灏嗚偂绁ㄧ晫闈㈠璞℃斁鍒颁富鐣岄潰鐨則ab閫夐」鍗¢噷闈㈡潵
+    ui->tabWidget->addTab(m_getStockList,"鑾峰彇淇℃伅");
+
+    m_stockPolicy = new StockPolicy(this);
+    ui->tabWidget->addTab(m_stockPolicy,"鑲$エ绛栫暐");
+
+    m_leadingCom = new LeadingCompany(this);
+    ui->tabWidget->addTab(m_leadingCom,"榫欏ご鍏徃");
+
+    m_showInfoMess = new ShowInfoMessage(this);
+    ui->tabWidget->addTab(m_showInfoMess,"淇℃伅鎻愮ず");
+
+    // 鍏宠仈涓�涓�2涓晫闈㈢殑淇″彿鍜屾Ы锛岀敤鏉ヤ紶閫掑浘琛ㄦ墍闇�鐨勬暟鎹強灞曠ず
+    connect(m_getStockList,SIGNAL(sendChartData(QLineSeries*)),m_stockPolicy,SLOT(showNewStockData(QLineSeries*)));
+    connect(m_getStockList,SIGNAL(sendChartData(QSplineSeries*)),m_stockPolicy,SLOT(showNewStockData(QSplineSeries*)));
+
+    connect(m_getStockList,SIGNAL(sendInfoMess(QString)),m_showInfoMess,SLOT(showInfo(QString)));
+
+}
diff --git a/clientmainwindow.h b/clientmainwindow.h
new file mode 100644
index 0000000..dbd9395
--- /dev/null
+++ b/clientmainwindow.h
@@ -0,0 +1,34 @@
+锘�#ifndef CLIENTMAINWINDOW_H
+#define CLIENTMAINWINDOW_H
+
+#include <QMainWindow>
+#include "getstocklist.h"
+#include "stockpolicy.h"
+#include "leadingcompany.h"
+#include "showinfomessage.h"
+
+namespace Ui {
+class ClientMainWindow;
+}
+
+class ClientMainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit ClientMainWindow(QWidget *parent = 0);
+    ~ClientMainWindow();
+
+    void initUi();
+
+private:
+    Ui::ClientMainWindow *ui;
+    GetStockList *m_getStockList;
+    StockPolicy *m_stockPolicy;
+    LeadingCompany *m_leadingCom; // 榫欏ご鍏徃
+    ShowInfoMessage *m_showInfoMess; // 鏄剧ず淇℃伅鎻愮ず
+
+
+};
+
+#endif // CLIENTMAINWINDOW_H
diff --git a/clientmainwindow.ui b/clientmainwindow.ui
new file mode 100644
index 0000000..9600480
--- /dev/null
+++ b/clientmainwindow.ui
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ClientMainWindow</class>
+ <widget class="QMainWindow" name="ClientMainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>900</width>
+    <height>591</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>ClientMainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralWidget">
+   <layout class="QGridLayout" name="gridLayout">
+    <item row="0" column="0">
+     <widget class="QTabWidget" name="tabWidget">
+      <property name="currentIndex">
+       <number>0</number>
+      </property>
+      <widget class="QWidget" name="tab">
+       <attribute name="title">
+        <string>Tab 1</string>
+       </attribute>
+      </widget>
+      <widget class="QWidget" name="tab_2">
+       <attribute name="title">
+        <string>Tab 2</string>
+       </attribute>
+      </widget>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>900</width>
+     <height>26</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QToolBar" name="mainToolBar">
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+  </widget>
+  <widget class="QStatusBar" name="statusBar"/>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/getstocklist.cpp b/getstocklist.cpp
new file mode 100644
index 0000000..d9f0fa0
--- /dev/null
+++ b/getstocklist.cpp
@@ -0,0 +1,635 @@
+锘�#include "getstocklist.h"
+#include "ui_getstocklist.h"
+#include <QDebug>
+#include <QFile>
+#include <QNetworkCookieJar>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QLibrary> // 鐢ㄤ簬鍔犺浇dll鍔ㄦ�佸簱鐨勭被
+
+GetStockList::GetStockList(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::GetStockList)
+{
+    ui->setupUi(this);
+    ui->pushButton_get->hide();
+    ui->statusbar->hide();
+
+    // 鏂规2:
+    // 濡傛灉https 璁块棶鐨勬椂鍊欙紝杩樻槸鐖彇澶辫触锛屽彲浠ヤ唬鐮佸姞杞藉姩鎬佸簱鏉ユ敮鎸�
+    // 鍓嶆彁鏉′欢鏄妸2涓猟ll鍔ㄦ�佸簱鎷疯礉鐨勭敓鎴愮洰褰曚腑:libeay32.dll 鍜� ssleay32.dll
+    // 鎷疯礉鍒扮敓鎴愮洰褰曪紝灏卞彲浠ョ洿鎺ュ姞杞�
+    QLibrary lb("libeay32.dll");
+    if(lb.load()){
+        qDebug()<<"load libeay32.dll 鎴愬姛";
+    }
+
+    QLibrary lb2("ssleay32.dll");
+    if(lb2.load()){
+        qDebug()<<"load ssleay32.dll 鎴愬姛";
+    }
+
+    // 鎸囧畾褰撳墠鏃ユ湡绫诲瀷涓� week
+    m_dateType = "week";
+    // 鍒濆鍖栧洖娴嬫暟閲忎负100
+    m_maTestNum = 100;
+
+    // 妯″瀷鍙婅〃鏍艰鍥�
+    m_model = new QStandardItemModel(this);
+    m_model->setColumnCount(10); // 璁剧疆10鍒�
+    QStringList labels;
+    labels<<"鑲$エ鍚嶅瓧"<<"鑲$エ浠e彿"<<"鎬诲競鍊�(浜�)"<<"娴侀�氬競鍊�(浜�)"<<"娑ㄨ穼骞�(%)"<<"鏀剁洏浠�"<<"鎴愪氦棰�(浜�)"<<"鎴愪氦閲�(鎵�)"<<"鎹㈡墜鐜�(%)"<<"甯傜泩鐜�";
+    m_model->setHorizontalHeaderLabels(labels); // 璁剧疆妯″瀷鐨勫垪鏍囩鍚�
+    ui->tableView->setModel(m_model); // 灏嗘ā鍨嬪拰瑙嗗浘鍏宠仈
+    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 璁剧疆鍐呭鑷�傚簲锛屾媺浼�
+
+    // 缁欒〃鏍艰鍥炬坊鍔犲彸鍑昏嚜瀹氫箟鑿滃崟
+    ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu); // 璁剧疆涓婁笅鏂囪彍鍗曠瓥鐣ヤ负鑷畾涔夎彍鍗�
+    connect(ui->tableView,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showMenu()));
+
+    m_menu = new QMenu(this);
+
+    QMenu *dateMenu = new QMenu("璁剧疆鍛ㄦ湡");
+    QAction *weekAction = dateMenu->addAction("璁剧疆涓哄懆");
+    QAction *monthAction = dateMenu->addAction("璁剧疆涓烘湀");
+    QAction *yearAction = dateMenu->addAction("璁剧疆涓哄勾");
+    m_menu->addMenu(dateMenu);
+
+    connect(weekAction,&QAction::triggered,this,[&]{ m_dateType = "week";}); // 淇敼鏃ユ湡绫诲瀷
+    connect(monthAction,&QAction::triggered,this,[&]{ m_dateType = "month";});
+    connect(yearAction,&QAction::triggered,this,[&]{ m_dateType = "year";});
+
+
+    QMenu *testMenu = new QMenu("璁剧疆鍥炴祴鑲$エ鏁伴噺");
+    QAction *pre100Action = testMenu->addAction("璁剧疆涓哄墠100");
+    QAction *pre300Action = testMenu->addAction("璁剧疆涓哄墠300");
+    QAction *pre500Action = testMenu->addAction("璁剧疆涓哄墠500");
+    QAction *pre1000Action = testMenu->addAction("璁剧疆涓哄墠1000");
+    QAction *pre5000Action = testMenu->addAction("璁剧疆涓哄墠5000");
+
+    m_menu->addMenu(testMenu);
+
+    connect(pre100Action,&QAction::triggered,this,[&]{ m_maTestNum = 100;}); // 淇敼鍥炴祴鏁伴噺绫诲瀷
+    connect(pre300Action,&QAction::triggered,this,[&]{ m_maTestNum = 300;});
+    connect(pre500Action,&QAction::triggered,this,[&]{ m_maTestNum = 500;});
+    connect(pre1000Action,&QAction::triggered,this,[&]{ m_maTestNum = 1000;});
+    connect(pre5000Action,&QAction::triggered,this,[&]{ m_maTestNum = 5000;});
+
+    QAction *policy = m_menu->addAction("绛栫暐鍒嗘瀽");
+    QAction *price =  m_menu->addAction("鏈�鏂颁环鏍�");
+    QAction *maPolicy = m_menu->addAction("MA绛栫暐");
+    QAction *macdPolicy = m_menu->addAction("MACD绛栫暐");
+    QAction *maTest100 = m_menu->addAction("MA绛栫暐-鍥炴祴");
+
+
+
+    connect(policy,SIGNAL(triggered(bool)),this,SLOT(policySlot())); // 褰撶偣鍑昏彍鍗曠瓥鐣ュ垎鏋愪箣鍚庯紝灏变細鍑哄彂妲� policySlot 鍑芥暟
+    connect(price,SIGNAL(triggered(bool)),this,SLOT(priceSlot()));
+    connect(maPolicy,SIGNAL(triggered(bool)),this,SLOT(maPolicySlot())); // MA鍧囩嚎绛栫暐
+    connect(macdPolicy,SIGNAL(triggered(bool)),this,SLOT(macdPolicySlot())); // MA鍧囩嚎绛栫暐
+    connect(maTest100,SIGNAL(triggered(bool)),this,SLOT(maTest100Slot())); // MA鍥炴祴鍓�100鍚�
+
+
+
+    // 澶勭悊鏁版嵁鐖彇鐨勬搷浣�
+    // 妯℃嫙娴忚鍣ㄧ殑鍙傛暟
+    QString userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36";
+    m_cookie = "__utma=1.731742638.1647403301.1699341909.1700229030.32; device_id=196eef62baf016c7d95a22752d9bdbab; smidV2=20240414233939e95389ecf7ecd2f4d08524ce770aacd500753aa68e9640320; s=c611de27gr; cookiesu=651726298794778; xq_a_token=220b0abef0fac476d076c9f7a3938b7edac35f48; xqat=220b0abef0fac476d076c9f7a3938b7edac35f48; xq_r_token=1d46f0ed628506486164e5055a4993f9b54b2f4c; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTcyOTIxMjc4NCwiY3RtIjoxNzI3NDkwOTU3MjA0LCJjaWQiOiJkOWQwbjRBWnVwIn0.C_GmKEhTaaioDMLWkgZyMXDl4duYEVmsdJHsTi7gbcNz0Tohc-uxHsaw0yBT5k-qmbrJ_RaLMCSxy06v14-R3dwL-MsiKRHxHa5qvQZN4BjEgvPRkqqvPgE_fkPLte8qQOEgd5iVkhr-4mjip0-9WCeXYiH7DygxFOBXGlgoPtpPzAtOTm5TWJmXh0ipDsIZxfNOl8jipXYaIdkv_kqLul5gqiBi5qqnwONDa24Zx-Kvpm8ySWiPFBLzZBqTuRBs4oKAMpSdOiYGLVL7dcSDDZyWqAexmrN4f19hkmd6gBHL4dCczRMDGYc1e98sQtlbZ5lgeEuuM24jjcuwCxsxXQ; u=651726298794778; Hm_lvt_1db88642e346389874251b5a1eded6e3=1727099939,1727251802,1727488707,1727491020; HMACCOUNT=1628106D67895387; acw_tc=2760828017275244258732552e9880f861be6db0c40facbdd5f223490decc2; acw_sc__v2=66f7ee8290dc3f63112948801ef331b8c97ccb35; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1727524485; .thumbcache_f24b8bbe5a5934237bbc0eda20c1b6e7=t00N841S/BEpxTGOoJrbm0blWik12om0ew/whcq/V2DNtyEA8um7J+yzeGOli+6iP/TrvrH0YKH2kHlsmDb5EQ%3D%3D; ssxmod_itna=YqAOBKYve+x0ODfxBcDB4DKM7RtAA4454DkDIEC+GAqGNK3DZDiqAPGhDC8RzeL4Ko7+e2aeQvSeopd5pYDk0Ge5TB0PIjaIDB3DEx06TCCQxiiSDCeDIDWeDiDG4Gm4qGtDpxG=DjDytZ9TtDm4GWGqDmDGYBWqDgDYQDGwIXD7QDIqtW07tQDDNQKpAKDiYeHlL5uMRMtOrK7DtDjdTD/3+kZCbCcPwVFeFO=nPcDB6wxBjZRq00Un+g4mNqLYf4IDAxQuYKtgheYYoAfDhTKhhLSGx4tGY4+GDKSiMS2DDAIvdKeD; ssxmod_itna2=YqAOBKYve+x0ODfxBcDB4DKM7RtAA4454DkDIEC+GDA69mqD/YttDFhxMltFKApT7bCMH+bytp7GQQyCbBWukeAF3+jxeN2wLjbQAFcdwbeNeoohjQ4qtEnLg4TKyX2LqVL=CGaV=GqZZqbDby8DFnFbgWiZEH8zoBzBCbzqWeqwoPq7/TpL=gIRY8sVhEpnWWHQU8sz+S8=+8oRerHq0wtQnSzyQDK7Dmvr3a+VY7fezRmxKF=bDeqexYUbuuzw2eR3In9evW6tzHbQY6vp=AIOUc9l6vc0vOl9plD6D07zGGQ41uxpii2Y5s7KvYQDWGYExD7=DYKKeD==";
+    QByteArray cookieByte = m_cookie.toUtf8();
+    QList<QNetworkCookie> list;
+    list.push_back(QNetworkCookie(cookieByte));
+
+    QVariant var;
+    var.setValue(list);
+    // 璁剧疆瑕佽闂殑缃戝潃
+    m_request.setUrl(QUrl("https://xueqiu.com/?md5__1038=QqGxcDnDyiitnD05o4%2Br%3Di%3De0KDtYqCDRWOoD"));
+    // 璁剧疆璇锋眰澶达紝鐢ㄦ埛浠g悊锛岀敤鏉ユā鎷熸祻瑙堝櫒
+    m_request.setHeader(QNetworkRequest::UserAgentHeader,userAgent);
+    // 璁剧疆cookie
+    //m_request.setHeader(QNetworkRequest::CookieHeader, var);
+
+    // 鏌ョ湅manager閮芥敮鎸佸摢浜涘崗璁�
+    qDebug()<<"鏀寔鐨勫崗璁�:"<<m_manager.supportedSchemes();
+    // 鍏宠仈淇″彿妲斤紝褰撹姹傜鐞嗗璞″畬鍏ㄦ墦寮�缃戦〉涔嬪悗锛屼細灏嗘暟鎹粰妲藉嚱鏁板鐞�
+    connect(&m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(showAplyData(QNetworkReply*)));
+    on_pushButton_get_clicked();
+
+    // 琛ㄦ牸鍒楁帓搴�
+    ui->tableView->setSortingEnabled(false);
+    ui->tableView->horizontalHeader()->setSortIndicatorShown(false);
+    connect(ui->tableView->horizontalHeader(),&QHeaderView::sortIndicatorChanged,this,[=](int index,Qt::SortOrder order){
+        qDebug()<<"sort:"<<index<<order;
+        m_model->sort(index,order);
+        ui->tableView->horizontalHeader()->setSortIndicatorShown(true);
+
+    });
+
+    // 瀹氭椂鑾峰彇鑲$エ浠e彿鐨勫畾鏃跺櫒鐩稿叧
+    m_getCodeTimer = new QTimer(this);
+    connect(m_getCodeTimer,SIGNAL(timeout()),this,SLOT(getCodeSlot()));
+
+}
+
+GetStockList::~GetStockList()
+{
+    delete ui;
+}
+
+/*
+ * 瑕佸鐞嗙殑澶ф鏍煎紡濡備笅
+ *
+ * {"data":{"count":5000,"list":[{"symbol":"SZ300817","net_profit_cagr":-17.50317062659299,"north_net_inflow":null,
+ * "ps":4.4809,"type":11,"percent":20.03,"has_follow":false,"tick_size":0.01,"pb_ttm":3.2607,"float_shares":99366912,
+ * "current":18.04,"amplitude":24.02,"pcf":21.3128,"current_year_percent":28.25,"float_market_capital":1.792579092E9,
+ * "north_net_inflow_time":null,"market_capital":3.1504802E9,"dividend_yield":1.153,"lot_size":100,"roe_ttm":5.6761589850147,
+ * "total_percent":78.15,"percent5m":0.0,"income_cagr":2.235799161377394,"amount":3.5973639118E8,"chg":3.01,
+ * "issue_date_ts":1581955200000,"eps":0.32,"main_net_inflows":6078207.0,"volume":21355714,"volume_ratio":4.35,"pb":3.143,
+ * "followers":6931,"turnover_rate":21.49,"first_percent":43.98,"name":"鍙岄鑲′唤","pe_ttm":56.123,"total_shares":174638592,
+ * "limitup_days":1}]}}
+ */
+
+// 鑾峰彇鎵�鏈夋勃娣辫偂绁ㄧ殑淇℃伅
+void GetStockList::getStockAllCode(QByteArray &buffer)
+{
+    // 浣跨敤JSON杩涜鏁版嵁澶勭悊
+    QJsonDocument jd = QJsonDocument::fromJson(buffer);
+    if(jd.isArray()){
+        qDebug()<<"js array";
+
+    }else if(jd.isObject()){
+        qDebug()<<"js object";
+        QJsonObject jobject = jd.object();
+        QStringList jlist = jobject.keys();
+        qDebug()<<"jlist:"<<jlist; // 杈撳嚭涓�涓嬩竴绾ч敭鐨勬儏鍐�
+        // 閫氳繃閿�煎鐨勬柟寮忔彁鍙栨暟鎹�
+        int count = jobject["data"].toObject()["count"].toInt();
+        qDebug()<<"count:"<<count;
+        QJsonArray listData = jobject["data"].toObject()["list"].toArray();
+        count = listData.size(); // 閫傚簲鏂扮増鐨勫鐞�
+        for(int i=0;i<count;++i){
+            QString symbol = listData.at(i).toObject().value("symbol").toString(); // 鑲$エ浠e彿
+            QString name = listData.at(i).toObject().value("name").toString();  // 鑲$エ鍚嶅瓧
+            double market_capital = listData.at(i).toObject().value("market_capital").toDouble()/100000000; // 鎬诲競鍊� 鍗曚綅 浜�
+            double float_market_capital = listData.at(i).toObject().value("float_market_capital").toDouble()/100000000; // 娴侀�氬競鍊� 鍗曚綅 浜�
+            double percent = listData.at(i).toObject().value("percent").toDouble(); // 娑ㄨ穼骞� 鐧惧垎姣旓紝澶т簬0涓婃定锛屽皬浜�0涓嬭穼
+            double current = listData.at(i).toObject().value("current").toDouble(); // 鏀剁洏浠�
+            double amount = listData.at(i).toObject().value("amount").toDouble()/100000000; // 鎴愪氦棰� 鍗曚綅 浜�
+            double volume = listData.at(i).toObject().value("volume").toInt(); // 鎴愪氦閲� 鍗曚綅 鎵�
+            double turnover_rate = listData.at(i).toObject().value("turnover_rate").toDouble(); // 鎹㈡墜鐜� 鐧惧垎姣�
+            double pe_ttm = listData.at(i).toObject().value("pe_ttm").toDouble(); // PE鍊� 甯傜泩鐜� 鐧惧垎姣�
+            //qDebug()<<name<<symbol<<market_capital;
+
+            m_codeNames[symbol] = name; // 娣诲姞鎴栬鐩栭敭鍊煎锛屼繚瀛樿偂绁ㄤ唬鍙峰拰鑲$エ鍚嶅瓧鍒癿ap涓�
+
+            // 娣诲姞妯″瀷琛岀殑鏁版嵁:鑲$エ鍚嶅瓧銆佽偂绁ㄤ唬鍙� 鎬诲競鍊� 娴侀�氬競鍊� 娑ㄨ穼骞� 鏀剁洏浠� 鎴愪氦棰� 鎴愪氦閲� 鎹㈡墜鐜� 甯傜泩鐜�
+            QList<QStandardItem*> rowItems;
+            rowItems.append(new QStandardItem(name));
+            rowItems.append(new QStandardItem(symbol));
+            rowItems.append(new QStandardItem(QString::number(market_capital,'f',2)));
+            rowItems.append(new QStandardItem(QString::number(float_market_capital)));
+            QStandardItem *percentItem =  new QStandardItem(QString::number(percent));
+            if(percent > 0){
+                percentItem->setData(QColor("red"),Qt::DecorationRole); // 娣诲姞涓�涓楗扮殑棰滆壊涓虹孩鑹�
+                percentItem->setData(QColor("red"),Qt::TextColorRole);  // 灏嗗瓧浣撻鑹茶缃负绾㈣壊
+                rowItems.at(0)->setData(QColor("red"),Qt::TextColorRole);  // 灏嗚偂绁ㄥ悕瀛楄缃负绾㈣壊
+             }
+            else if(percent < 0){
+                percentItem->setData(QColor("green"),Qt::BackgroundColorRole);
+                rowItems.at(0)->setData(QColor("green"),Qt::TextColorRole);
+            }
+            rowItems.append(percentItem);
+            rowItems.append(new QStandardItem(QString::number(current)));
+            rowItems.append(new QStandardItem(QString::number(amount)));
+            rowItems.append(new QStandardItem(QString::number(volume)));
+            rowItems.append(new QStandardItem(QString::number(turnover_rate)));
+            if(pe_ttm > 0){
+                rowItems.append(new QStandardItem(QString::number(pe_ttm)));
+            }
+            else{
+                rowItems.append(new QStandardItem("浜忔崯"));
+            }
+            // 娣诲姞涓�琛屾暟鎹」鍒版ā鍨嬩腑
+            m_model->appendRow(rowItems);
+        }
+    }
+}
+
+
+/*  瑕佸鐞嗙殑鍗曚釜鑲$エ鐨勬牸寮忓涓�
+{"data":{" ":"SH601127","column":["timestamp","volume","open","high","low","close","chg","percent","turnoverrate","amount","volume_post","amount_post"],
+"item":[[1680192000000,592214010,37.57,41.56,35.63,37.85,0.2,0.53,50.63,2.3075281252E10,0,0.0],
+[1682611200000,355174985,36.6,36.6,28.61,29.52,-8.33,-22.01,27.0,1.1568002446E10,0,0.0],
+[1685462400000,345031667,29.51,30.1,25.27,25.78,-3.74,-12.67,23.04,9.442101926E9,0,0.0],
+[1688054400000,1217980960,25.6,42.19,24.75,36.77,10.99,42.63,81.24,4.2515733378E10,0,0.0],
+[1688572800000,427585117,37.5,47.3,37.06,46.62,9.85,26.79,28.37,1.8368604411E10,0,0.0]]},"error_code":0,"error_description":""}
+
+*/
+// 鍗曚釜鑲$エ鐨� JSON鏍煎紡澶勭悊
+void GetStockList::getStockOne(QByteArray &buffer)
+{
+    QJsonDocument jd = QJsonDocument::fromJson(buffer);
+    if(jd.isObject()){
+        QJsonObject jObject = jd.object();
+        QJsonArray jArr = jObject.value("data").toObject().value("item").toArray(); // 閫氳繃閿�煎鍙栧��
+        int cnt = jArr.count();
+        qDebug()<<"鏁扮粍size:"<<cnt;
+        QString symbol = jObject.value("data").toObject().value("symbol").toString();
+        QString code = symbol; // 鑲$エ浠e彿
+        QLineSeries *series = new QLineSeries;  // QLineSeries 鎶樼嚎鐨勭被锛孮SplineSeries 涓哄渾婊戞洸绾跨被
+        series->setName(symbol);  // 璁剧疆鎶樼嚎鍚嶅瓧
+        //series->setColor(QColor(255,0,0)); // 璁剧疆棰滆壊 r,g,b 绾㈢豢钃濅笁鍘熻壊锛岄殢鎰忕粍鍚�
+        QSplineSeries *sp = new QSplineSeries;
+        sp->setName(symbol);
+        QSplineSeries *spVolume = new QSplineSeries;
+        spVolume->setName(symbol.append("--volume"));
+        QSplineSeries *spAmount = new QSplineSeries;
+        spVolume->setName(symbol.append("--amount"));
+
+        int ma10_20_flag = 0; // 鏍囪MA閲戝弶銆佹鍙夌殑鎯呭喌 0:鍒濆鍊硷紝1锛氶噾鍙夛紝-1锛氭鍙�
+        long long oldVolume = 0; // MACD: 鑰佺殑鎴愪氦閲�
+        int macd_buy = 0; // 涔板叆鏍囧織
+        double buy_price = 0; // 涔板叆浠锋牸
+        double rate_all = 0; // 鏀剁泭鐧惧垎姣�
+        for(int i=0;i<cnt;++i){
+            qint64 timestamp = jArr.at(i).toArray().at(0).toVariant().toLongLong();
+            double close = jArr.at(i).toArray().at(5).toVariant().toDouble();
+            long long volume = jArr.at(i).toArray().at(1).toVariant().toLongLong()/100;
+
+            long long amount = jArr.at(i).toArray().at(9).toVariant().toLongLong()/100000000;
+            QString curDateTime = QDateTime::fromMSecsSinceEpoch(timestamp).toString("yyyy-MM-dd");
+            //qDebug()<<curDateTime<<close<<volume<<amount;
+            series->append(timestamp,close); // 鎶樼嚎鏁版嵁娣诲姞
+            sp->append(timestamp,close);  // 鏇茬嚎鏁版嵁娣诲姞
+            spVolume->append(timestamp,volume);
+            spAmount->append(timestamp,amount);
+            if(m_menuIndex == 2){
+                // MA  ma10浜a20 閲戝弶锛宮a10浜a60 姝诲弶
+                double ma5 = jArr.at(i).toArray().at(12).toVariant().toDouble();
+                double ma10 = jArr.at(i).toArray().at(13).toVariant().toDouble();
+                double ma20 = jArr.at(i).toArray().at(14).toVariant().toDouble();
+                double ma30 = jArr.at(i).toArray().at(15).toVariant().toDouble();
+                //qDebug()<<"MA5-10-20-30"<<ma5<<ma10<<ma20<<ma30;
+                if(i>0){
+                    double ma5_old = jArr.at(i-1).toArray().at(12).toVariant().toDouble();
+                    double ma10_old = jArr.at(i-1).toArray().at(13).toVariant().toDouble();
+                    double ma20_old = jArr.at(i-1).toArray().at(14).toVariant().toDouble();
+                    double ma30_old = jArr.at(i-1).toArray().at(15).toVariant().toDouble();
+
+//                    if(ma5_old > ma20_old && ma5 <= ma20){
+//                        // 姝诲弶
+//                        qDebug()<<"MA5-20姝诲弶:"<<curDateTime<<" 浠锋牸:"<<close;
+//                    }else if(ma5_old < ma20_old && ma5 >= ma20){
+//                        // 閲戝弶
+//                        qDebug()<<"MA5-20閲戝弶:"<<curDateTime<<" 浠锋牸:"<<close;
+//                    }
+
+                    if(ma10_old > ma20_old && ma10 <= ma20){
+                        // 姝诲弶
+                        qDebug()<<"MA10-20姝诲弶:"<<curDateTime<<" 浠锋牸:"<<close;
+                        if(buy_price == 0) buy_price = close;
+                        double tmp_rate = (close-buy_price)/buy_price;
+                        rate_all += tmp_rate;
+
+                        QString info = QString("<font size=8 color=green> %3 %6 MA10-20姝诲弶:%1 浠锋牸:%2   鐩堝埄姣�:%4  鎬荤泩鍒�:%5</font>").arg(curDateTime).arg(close).arg(code)
+                                .arg(QString::number(tmp_rate*100)).arg(QString::number(rate_all*100)).arg(m_codeNames[code]);
+                        emit sendInfoMess(info);
+                        //buy_price = close; // 姝诲弶涔板叆鐨勬儏鍐�
+                    }else if(ma10_old < ma20_old && ma10 >= ma20){
+                        // 閲戝弶
+                        buy_price = close; // 閲戝弶涔板叆鐨勬儏鍐�
+
+                        qDebug()<<"MA10-20閲戝弶:"<<curDateTime<<" 浠锋牸:"<<close;
+//                        if(buy_price == 0) buy_price = close;
+//                        double tmp_rate = (close-buy_price)/buy_price;
+//                        rate_all += tmp_rate;
+                        QString info = QString("<font size=8 color=red> %3 %4 MA10-20閲戝弶:%1 浠锋牸:%2 </font>").arg(curDateTime).arg(close).arg(code).arg(m_codeNames[code]);
+                                //.arg(QString::number(tmp_rate*100)).arg(QString::number(rate_all*100));
+                        emit sendInfoMess(info);
+
+                    }
+                }
+            }else if(m_menuIndex == 3){
+                // MACD绛栫暐 缁撳悎鎴愪氦閲忔潵鍒ゆ柇浼氭洿濂�:涔板叆鐐规垚浜ら噺缁х画鏀惧ぇ鍒欐寔鏈夛紝缂╁皬鍒欑鍦�
+                double dea = jArr.at(i).toArray().at(12).toVariant().toDouble();
+                double dif = jArr.at(i).toArray().at(13).toVariant().toDouble();
+                double macd = jArr.at(i).toArray().at(14).toVariant().toDouble();
+
+                if(macd_buy == 1 && oldVolume > volume){
+                    QString info = QString("<font size=8 color=green> %4 MACD 鎴愪氦閲忓垵娆¤椤� 绂诲満1:%1 浠锋牸:%2 MACD=%3  </font>").arg(curDateTime).arg(close).arg(macd).arg(code);
+                    emit sendInfoMess(info);
+                    macd_buy = 0;
+                    oldVolume = 0;
+
+                }
+                if(i > 0){
+                    double dea_old = jArr.at(i-1).toArray().at(12).toVariant().toDouble();
+                    double dif_old = jArr.at(i-1).toArray().at(13).toVariant().toDouble();
+                    double macd_old = jArr.at(i-1).toArray().at(14).toVariant().toDouble();
+
+                    if(dif_old > dea_old && dif <= dea){
+                        // 姝诲弶
+                        qDebug()<<"MACD姝诲弶:"<<curDateTime<<" 浠锋牸:"<<close <<"MACD="<<macd ;
+                        QString info=QString("<font size=8 color=green> %4 MACD姝诲弶:%1 浠锋牸:%2 MACD=%3  </font>").arg(curDateTime).arg(close).arg(macd).arg(code);
+                        emit sendInfoMess(info);
+                    }else if(dif_old < dea_old && dif >= dea){
+                        // 閲戝弶
+                        qDebug()<<"MACD閲戝弶:"<<curDateTime<<" 浠锋牸:"<<close <<"MACD="<<macd <<"寤鸿璁板綍褰撳墠閲戝弶MACD鐨勫�硷紝鑻ュ悗闈㈡湁浣庝簬姝ゅ�硷紝鍏虫敞绂诲満鎻愮ず";
+                        QString info=QString("<font size=9 color=red> %4 MACD閲戝弶:%1 浠锋牸:%2 MACD=%3 寤鸿璁板綍褰撳墠閲戝弶MACD鐨勫�硷紝鑻ュ悗闈㈡湁浣庝簬姝ゅ�硷紝鍏虫敞绂诲満鎻愮ず </font>").arg(curDateTime).arg(close).arg(macd).arg(code);
+                        emit sendInfoMess(info);
+
+                        macd_buy = 1;
+                        oldVolume = volume;
+                    }
+                }
+            }
+
+
+        }
+        if(m_menuIndex == 0){
+            // 绛栫暐鍒嗘瀽  鍙兘閫変竴绉嶇嚎褰㈡暟鎹�
+            //emit sendChartData(series); // 鍙戦�佹姌绾挎暟鎹�
+            emit sendChartData(sp);   // 鍙戦�佹洸绾挎暟鎹� 鏀剁洏浠�
+            emit sendChartData(spVolume); // 鍙戦�佷氦鏄撻噺鏇茬嚎
+            emit sendChartData(spAmount); // 浜ゆ槗棰濇洸绾�
+        }else if(m_menuIndex == 1){
+            // 鏈�鏂颁环鏍�
+        }else if(m_menuIndex == 2){
+            // MA绛栫暐
+        }else if(m_menuIndex == 3){
+            // MACD绛栫暐
+        }
+    }
+}
+
+
+/* 鑾峰彇琛屼笟淇℃伅
+ *
+ * {"data":{"industries":[{"encode":"S1101","name":"绉嶆涓�","pinyin":"zzy"},
+ * {"encode":"S1102","name":"娓斾笟","pinyin":"yy"},{"encode":"S1103","name":"鏋椾笟","pinyin":"ly"},
+ * {"encode":"S1104","name":"楗叉枡","pinyin":"sl"},{"encode":"S1105","name":"鍐滀骇鍝佸姞宸�","pinyin":"ncpjg"},
+ * {"encode":"S1107","name":"鍏绘畺涓�","pinyin":"yzy"},{"encode":"S1108","name":"鍔ㄧ墿淇濆仴","pinyin":"dwbj"},
+ * {"encode":"S1109","name":"鍐滀笟缁煎悎","pinyin":"nyzh"},{"encode":"S2202","name":"鍖栧鍘熸枡","pinyin":"hxyl"},
+ * {"encode":"S2203","name":"鍖栧鍒跺搧","pinyin":"hxzp"},{"encode":"S2204","name":"鍖栧绾ょ淮","pinyin":"hxxw"
+ * */
+
+void GetStockList::getIndustryInfo(QByteArray &buffer)
+{
+
+    QJsonDocument jd = QJsonDocument::fromJson(buffer);
+    if(jd.isObject()){
+        QJsonObject jObject = jd.object();
+        QJsonArray jArr = jObject.value("data").toObject().value("industries").toArray(); // 閫氳繃閿�煎鍙栧��
+        int cnt = jArr.count();
+        for(int i=0;i<cnt;++i){
+            QJsonObject tmpObj = jArr[i].toObject();
+            QString encode = tmpObj.value("encode").toString();
+            QString name = tmpObj.value("name").toString();
+            qDebug()<<encode<<name;
+            m_industryInfo[encode] = name; // 娣诲姞鍒拌涓歮ap閲岄潰鍘讳繚瀛�
+
+            // 鎺ョ潃閬嶅巻鎵�鏈夎涓氭嫢鏈夌殑瀵瑰簲鑲$エ
+            m_curIndustry = encode; // 璁剧疆褰撳墠琛屼笟
+            QString url = QString("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=1&size=100&order=desc&order_by=percent&market=CN&ind_code=%1").arg(encode);
+            m_request.setUrl(url);
+            m_manager.get(m_request);
+        }
+
+    }
+}
+
+
+/*
+
+{"data":{"count":21,"list":[{"symbol":"SZ000995","net_profit_cagr":92.61556393554986,
+"north_net_inflow":null,"ps":19.4318,"type":11,"percent":1.86,"has_follow":false,
+"tick_size":0.01,"pb_ttm":20.688,"float_shares":177408000,"current":16.95,
+"amplitude":8.65,"pcf":534.2042,"current_year_percent":2.73,"float_market_capital":3.0070656E9,
+"north_net_inflow_time":null,"market_capital":3.0070656E9,"dividend_yield":null,"lot_size":100,
+"roe_ttm":2.8913250918407045,"total_percent":90.46,"percent5m":0.53,"income_cagr":19.383233238212405,
+"amount":5.4679898205E8,"chg":0.31,"issue_date_ts":965577600000,"eps":0.02,"main_net_inflows":-9917325.0,
+"volume":32611719,"volume_ratio":1.31,"pb":20.688,"followers":46602,"turnover_rate":18.38,"mapping_quote_current":null,
+"first_percent":99.74,"name":"鐨囧彴閰掍笟","pe_ttm":731.576,"dual_counter_mapping_symbol":null,"total_shares":177408000,"limitup_days":0},
+
+*/
+void GetStockList::getStockByIndustry(QByteArray &buffer,QString industryCode)
+{
+    // 閫氳繃琛屼笟鑾峰彇鑲$エ淇℃伅
+    static int sAllCnt = 0;
+    QJsonDocument jd = QJsonDocument::fromJson(buffer);
+    if(jd.isObject()){
+        QJsonObject jObject = jd.object();
+        QJsonArray jArr = jObject.value("data").toObject().value("list").toArray(); // 閫氳繃閿�煎鍙栧��
+        int allCnt = jObject.value("data").toObject().value("count").toInt();
+        sAllCnt += allCnt;
+        int cnt = jArr.count();
+        qDebug()<<"琛屼笟:"<<industryCode<<m_industryInfo[industryCode]<<"allCnt:"<<allCnt<<"pageCnt:"<<cnt;
+        for(int i=0;i<cnt;++i){
+            QString symbol = jArr[i].toObject().value("symbol").toString();
+            QString name = jArr[i].toObject().value("name").toString();
+            m_codeAndIndustry[symbol].append(m_industryInfo[industryCode]); // 娣诲姞琛屼笟鍒板搴攎ap
+            qDebug()<<"鑲$エ:"<<symbol<<name<<industryCode;
+        }
+    }
+    qDebug()<<"琛屼笟缁熻鍒扮殑鑲$エsAllCnt"<<sAllCnt;
+}
+
+void GetStockList::on_pushButton_get_clicked()
+{
+    qDebug()<<"寮�濮嬭姹�";
+    m_manager.get(m_request);
+    qDebug()<<"璇锋眰涓�...";
+}
+
+void GetStockList::showAplyData(QNetworkReply *reply)
+{
+    qDebug()<<"鏀跺埌鍝嶅簲";
+    // 灏嗗搷搴旂殑鏁版嵁锛屼竴鎶婅鍙栧畬锛屾斁鍒板瓧鑺傛暟缁勯噷闈㈡潵澶勭悊
+    QByteArray buffer = reply->readAll();
+
+    // 灏嗘暟鎹啓鍒版枃浠朵腑锛屾柟渚胯瀵熸暟鎹唴瀹�
+    QFile file("data.txt");
+    file.open(QIODevice::ReadWrite | QIODevice::Text);
+    QTextStream out(&file);
+    out << buffer << endl;
+    file.close();
+
+    // 涓嬮潰浣跨敤JSON杩涜鏁版嵁澶勭悊
+    if(reply->url() == QUrl("https://xueqiu.com/")){
+        qDebug()<<"鍙戠幇棣栭〉url";
+        qDebug()<<buffer;
+
+    }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/chart/kline.json") != -1){
+        qDebug()<<"鏌ョ湅涓偂鎯呭喌:";
+        getStockOne(buffer);
+
+    }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=1&size=100&order=desc&order_by=percent&market=CN&ind_code") != -1){
+        qDebug()<<"鏍规嵁琛屼笟鑾峰彇鑲$エ淇℃伅"<<reply->url();
+        QString industryCode = reply->url().toString().split("=").back();
+        qDebug()<<"琛屼笟淇℃伅:"<<industryCode;
+        getStockByIndustry(buffer,industryCode);
+
+    }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/screener/quote/list.json") != -1){
+        qDebug()<<"鑾峰彇鎵�鏈夋勃娣辫偂绁� 鍙互骞叉椿浜�";
+        getStockAllCode(buffer);
+    }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/screener/industries.json") != -1){
+        qDebug()<<"鑾峰彇琛屼笟淇℃伅";
+        getIndustryInfo(buffer);
+    }
+
+    reply->deleteLater();
+}
+
+void GetStockList::on_pushButton_get_2_clicked()
+{
+
+    m_model->setRowCount(0); // 娓呴櫎褰撳墠妯″瀷涓殑鍐呭
+
+    // 鏈�濂借緭鍑轰竴涓嬫墍鏈夎偂绁ㄥ強琛屼笟淇℃伅
+    qDebug()<<"涓�鎶婅兘鐪嬪埌鐨勮偂绁ㄦ暟閲�"<<m_codeAndIndustry.size();
+    for(auto it = m_codeAndIndustry.begin();it != m_codeAndIndustry.end();++it){
+        qDebug()<<it.key()<<"鎵�灞炶涓氭暟閲�:"<<it.value().size();
+        for(auto e:it.value()){
+            qDebug()<<e;
+        }
+    }
+
+//    // 璁剧疆瑕佺埇鍙栫殑鏍稿績缃戝潃
+//    m_request.setUrl(QUrl("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=1&size=5000&order=desc&orderby=amount&order_by=amount&market=CN&type=sh_sz"));
+//    // 鎵цget璇锋眰锛屽幓鎷跨綉鍧�瀵瑰簲鐨勬暟鎹�
+//    m_manager.get(m_request);
+//    qDebug()<<"req ok";
+
+    // 2024-9-21 淇敼鏂扮増锛屽畼鏂瑰仛浜嗘暟閲忛檺鍒讹紝鍙互鍗曢〉100鏉★紝浣嗘槸涓嶈兘涓�鎶婂彇鎵�鏈変簡
+    //m_request.setHeader(QNetworkRequest::CookieHeader,m_cookie);
+    //m_request.setHeader(QNetworkRequest::SetCookieHeader,m_cookie);
+
+    int allCnt = 6000;
+    int singlePageCnt = 90; // 鍗曢〉鑲$エ鐨勮偂绁ㄦ暟閲�
+    int pages = allCnt/singlePageCnt;
+
+    qDebug()<<"璇锋眰鑲$エ浠e彿:"<<QTime::currentTime();
+    for(int i=1;i<=pages;++i){
+        QString url = QString("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=%1&size=%2&order=desc&orderby=amount&order_by=amount&market=CN&type=sh_sz").arg(i).arg(singlePageCnt);
+        m_request.setUrl(QUrl(url));
+        m_manager.get(m_request);
+    }
+    qDebug()<<"OK--瀹屾垚璇锋眰鑲$エ浠e彿:"<<QTime::currentTime();
+
+    // 浣跨敤瀹氭椂鍣ㄦ潵瀹氭椂鑾峰彇
+//    m_getCodeTimer->start(10);
+
+}
+
+void GetStockList::showMenu()
+{
+    qDebug()<<"鍙冲嚮鑿滃崟";
+    m_menu->popup(QCursor::pos());  // 鍦ㄩ紶鏍囧厜鏍囩殑浣嶇疆寮瑰嚭鑿滃崟
+}
+
+void GetStockList::policySlot()
+{
+    qDebug()<<"绛栫暐鏌ョ湅";
+    if(m_model->rowCount() == 0)return; // 闃叉寮傚父
+
+    int row = ui->tableView->currentIndex().row(); // 鍙栧嚭鑿滃崟鎵�鍦ㄧ殑琛屽彿
+    QString symbol = m_model->item(row,1)->text(); // 鍙栧綋鍓嶈鎵�鍦ㄧ殑鑲$エ浠e彿
+    qint64 begin = QDateTime::currentMSecsSinceEpoch(); // 鍙栧綋鍓嶆椂闂存埑
+    m_numsCnt = 30; // 杩欓噷鏄缃幏鍙栧崟涓偂绁ㄧ殑鏁版嵁閲�
+    QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=week&type=before&count=-%3&indicator=kline").arg(symbol).arg(begin).arg(m_numsCnt);
+    qDebug()<<urlStr;
+    qDebug()<<"褰撳墠鑲$エ:"<<symbol<<m_model->item(row,0)->text();
+    // 涓嬩竴姝ュ氨鏄牴鎹畊rl璇锋眰鍒扮殑鏁版嵁锛岃繘琛屽垎鏋�
+    m_menuIndex = 0; // 绗竴涓彍鍗�
+    m_request.setUrl(QUrl(urlStr)); // 璁剧疆鏂扮殑缃戝潃
+    m_manager.get(m_request);  // 鎵撳紑缃戝潃锛屾嬁鏁版嵁
+}
+
+void GetStockList::priceSlot()
+{
+    qDebug()<<"鏈�鏂颁环鏍�";
+    if(m_model->rowCount() == 0)return;
+    int row = ui->tableView->currentIndex().row();
+    QString symbol = m_model->item(row,1)->text(); // 鍙栧綋鍓嶈鎵�鍦ㄧ殑鑲$エ浠e彿
+    qint64 begin = QDateTime::currentMSecsSinceEpoch(); // 鍙栧綋鍓嶆椂闂存埑
+    int numsCnt = 20;
+    QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=day&type=before&count=-%3&indicator=kline").arg(symbol).arg(begin).arg(numsCnt);
+    qDebug()<<urlStr;
+    // 涓嬩竴姝ュ氨鏄牴鎹畊rl璇锋眰鍒扮殑鏁版嵁锛岃繘琛屽垎鏋�
+    m_menuIndex = 1; // 绗簩涓彍鍗曢」
+    m_request.setUrl(QUrl(urlStr));
+    m_manager.get(m_request);
+
+}
+
+void GetStockList::maPolicySlot()
+{
+    qDebug()<<"鎵цMA绛栫暐";
+    emit sendInfoMess("<font size=12 color=pink>鎵цMA绛栫暐 </font>");
+    int curRow = ui->tableView->currentIndex().row();
+    QString symbol = m_model->item(curRow,1)->text();
+    qint64 begin = QDateTime::currentMSecsSinceEpoch(); // 鍙栧綋鍓嶆椂闂存埑
+    int numsCnt = 300;
+    QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=%4&type=before&count=-%3&indicator=kline,ma").arg(symbol).arg(begin).arg(numsCnt).arg(m_dateType);
+    qDebug()<<urlStr;
+    qDebug()<<"褰撳墠鑲$エ:"<<symbol<<m_model->item(curRow,0)->text();
+    // 涓嬩竴姝ュ氨鏄牴鎹畊rl璇锋眰鍒扮殑鏁版嵁锛岃繘琛屽垎鏋�
+    m_menuIndex = 2; // 绗笁涓彍鍗曢」
+    m_request.setUrl(QUrl(urlStr));
+    m_manager.get(m_request);
+
+}
+
+void GetStockList::maTest100Slot()
+{
+    for(int i=0;i<m_model->rowCount() && i < m_maTestNum;++i){
+        ui->tableView->setCurrentIndex(m_model->index(i,0)); // 璁剧疆褰撳墠琛ㄦ牸绱㈠紩锛屼富瑕佹槸涓轰簡璁剧疆琛�
+        maPolicySlot(); // 璋冪敤MA绛栫暐鍘诲洖娴�
+    }
+}
+
+void GetStockList::macdPolicySlot()
+{
+    qDebug()<<"鎵цMACD绛栫暐";
+    emit sendInfoMess("<font size=12 color=pink>鎵цMACD绛栫暐 </font>");
+    int curRow = ui->tableView->currentIndex().row();
+    QString symbol = m_model->item(curRow,1)->text();
+    qint64 begin = QDateTime::currentMSecsSinceEpoch(); // 鍙栧綋鍓嶆椂闂存埑
+    int numsCnt = 300;
+    QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=week&type=before&count=-%3&indicator=kline,macd").arg(symbol).arg(begin).arg(numsCnt);
+    qDebug()<<urlStr;
+    qDebug()<<"褰撳墠鑲$エ:"<<symbol<<m_model->item(curRow,0)->text();
+    // 涓嬩竴姝ュ氨鏄牴鎹畊rl璇锋眰鍒扮殑鏁版嵁锛岃繘琛屽垎鏋�
+    m_menuIndex = 3; // 绗洓涓彍鍗曢」
+    m_request.setUrl(QUrl(urlStr));
+    m_manager.get(m_request);
+
+}
+
+void GetStockList::getCodeSlot()
+{
+    // 2024-9-21 淇敼鏂扮増锛屽畼鏂瑰仛浜嗘暟閲忛檺鍒讹紝鍙互鍗曢〉100鏉★紝浣嗘槸涓嶈兘涓�鎶婂彇鎵�鏈変簡
+    static int allCnt = 6000;
+    static int pages = allCnt/100;
+    static int i=1;
+
+    QString url = QString("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=%1&size=100&order=desc&orderby=amount&order_by=amount&market=CN&type=sh_sz").arg(i);
+    m_request.setUrl(QUrl(url));
+    m_manager.get(m_request);
+
+    ++i;
+    if(i > pages){
+        i=1;
+        m_getCodeTimer->stop(); // 鍋滄帀瀹氭椂鍣�
+    }
+
+}
+
+void GetStockList::on_pushButton_industry_clicked()
+{
+    // 鑾峰彇琛屼笟淇℃伅锛岃兘鎷垮埌 琛屼笟浠g爜鍜屽悕瀛楋紝绠�鍐欑瓑
+    QString url = "https://stock.xueqiu.com/v5/stock/screener/industries.json?category=cn";
+    m_request.setUrl(QUrl(url));
+    m_manager.get(m_request);
+
+}
diff --git a/getstocklist.h b/getstocklist.h
new file mode 100644
index 0000000..8499a1d
--- /dev/null
+++ b/getstocklist.h
@@ -0,0 +1,85 @@
+锘�#ifndef GETSTOCKLIST_H
+#define GETSTOCKLIST_H
+
+#include <QMainWindow>
+#include <QNetworkAccessManager>
+#include <QNetworkCookie>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QStandardItemModel>
+#include <QMenu>
+#include <QLineSeries>   // 鎶樼嚎绫�
+#include <QSplineSeries> // 鏇茬嚎绫�
+#include <QTimer>
+
+QT_CHARTS_USE_NAMESPACE  // 鍛藉悕绌洪棿寰椾娇鐢ㄨ捣鏉ワ紝瑕佷笉鐒剁被浼氭嬁涓嶅埌
+
+
+/*
+ * 鍏充簬SSL鐨勫鐞嗭紝鐢变簬瑕佽姹� https鐨勯摼鎺ワ紝闇�瑕佸皢缂栬瘧鍣ㄧ洰褰曚笅鐨勪袱涓猟ll鍔ㄦ�佸簱鎷疯礉鍒板搴旂紪璇戝櫒鐨刡in鐩綍涓�
+ * 灏唋ibeay32.dll 鍜� ssleay32.dll 涓や釜鏂囦欢澶嶅埗鍒板搴旂殑鍖哄煙
+ * 渚嬪浠庣紪璇戝櫒鐨刼pt\bin鍘熷鐩綍锛�...\Qt5.9.4\Tools\mingw530_32\opt\bin 鎵句釜杩�2涓猟ll
+ * 鎷疯礉鍒扮紪璇戝櫒鐨刡in鐩綍涓�: ...\Qt5.9.4\Tools\mingw530_32\bin
+ */
+namespace Ui {
+class GetStockList;
+}
+
+class GetStockList : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit GetStockList(QWidget *parent = 0);
+    ~GetStockList();
+    void getStockAllCode(QByteArray &buffer); // 鑾峰彇鎵�鏈夋勃娣辫偂绁ㄧ殑淇℃伅
+    void getStockOne(QByteArray &buffer); // 鑾峰彇鍗曞彧鑲$エ鐨勫鐞�
+    void getIndustryInfo(QByteArray &buffer); // 鑾峰彇琛屼笟淇℃伅
+    void getStockByIndustry(QByteArray &buffer,QString industryCode); // 閫氳繃琛屼笟鑾峰彇鑲$エ
+
+signals:
+    void sendChartData(QLineSeries*);  // 鎶樼嚎
+    void sendChartData(QSplineSeries*);  // 鏇茬嚎
+    void sendInfoMess(QString); // 鍙戦�佹秷鎭彁绀�
+
+private slots:
+    void on_pushButton_get_clicked();
+    void showAplyData(QNetworkReply *reply);  // 鐢ㄦ潵鍝嶅簲璇锋眰鐨勫洖浼犳暟鎹殑妲藉嚱鏁�
+
+    void on_pushButton_get_2_clicked();  // 鑾峰彇娌繁鑲″競鏁版嵁鐨勬寜閽Ы鍑芥暟
+    void showMenu();
+    void policySlot();
+    void priceSlot();
+    void maPolicySlot(); // MA绛栫暐妲�
+    void maTest100Slot(); // MA绛栫暐鍥炴祴鍓�100鍚嶆Ы
+    void macdPolicySlot(); // MACD绛栫暐妲�
+
+    void getCodeSlot(); // 鑾峰彇鑲$エ浠e彿鐨勫畾鏃跺櫒鐨勬Ы
+
+    void on_pushButton_industry_clicked();
+
+private:
+    Ui::GetStockList *ui;
+    // 杩�2涓敤浜庣埇鍙栨暟鎹殑
+    QNetworkRequest m_request; // 鐢ㄤ簬绠$悊璇锋眰澶寸殑
+    QString m_cookie; // 缂撳瓨
+    QNetworkAccessManager m_manager; // 鐢ㄤ簬绠$悊http璇锋眰鍙婂搷搴旂殑
+
+    // 涓嬮潰杩欏嚑涓敤浜庢樉寮忕埇鍒扮殑鑲$エ鏁版嵁
+    QStandardItemModel *m_model; // 鏍囧噯椤规ā鍨嬶紝鐢ㄦ潵瀛樺偍鏁版嵁鐨勶紝灏嗘ā鍨嬪拰瑙嗗浘杩涜浜嗗垎绂�
+    QMenu *m_menu; // 鑿滃崟鎸囬拡锛岀敤鏉ュ鐞嗗彸鍑昏彍鍗曠殑
+    int m_numsCnt; // 鍗曚釜鑲$エ鐨勬暟鎹鏁�
+    int m_menuIndex; // 閽堝鍗曚釜鑲$エ闇�瑕佸垽鏂槸鍝釜鎿嶄綔锛岀敤鏉ヨ褰曚笅鏍囩殑
+
+    QTimer *m_getCodeTimer; // 鑾峰彇鑲$エ浠e彿鐨勫畾鏃跺櫒
+    QMap<QString,QString> m_codeNames; // 鑲$エ浠e彿鍜屽悕瀛�
+
+    QMap<QString,QString> m_industryInfo; // 琛屼笟浠g爜鍜岃涓氬悕瀛�
+    QMap<QString,QVector<QString>> m_codeAndIndustry; // 鑲$エ浠e彿鍙婂搴旂殑琛屼笟浠g爜
+    QString m_curIndustry; // 褰撳墠琛屼笟
+    QString m_dateType; // 鏃ユ湡绫诲瀷锛歞ay week month year
+    int m_maTestNum; // ma绛栫暐鍥炴祴鏁伴噺
+
+};
+
+#endif // GETSTOCKLIST_H
diff --git a/getstocklist.ui b/getstocklist.ui
new file mode 100644
index 0000000..cec3bef
--- /dev/null
+++ b/getstocklist.ui
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>GetStockList</class>
+ <widget class="QMainWindow" name="GetStockList">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QGridLayout" name="gridLayout">
+    <item row="0" column="0">
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <widget class="QPushButton" name="pushButton_get">
+        <property name="text">
+         <string>鑾峰彇棣栭〉</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_industry">
+        <property name="text">
+         <string>鑾峰彇琛屼笟瀵瑰簲鑲$エ</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_get_2">
+        <property name="text">
+         <string>鑾峰彇娌繁鑲″競鑲$エ浠e彿</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+    <item row="1" column="0">
+     <widget class="QTableView" name="tableView"/>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>800</width>
+     <height>26</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/leadingcompany.cpp b/leadingcompany.cpp
new file mode 100644
index 0000000..c3b148f
--- /dev/null
+++ b/leadingcompany.cpp
@@ -0,0 +1,46 @@
+锘�#include "leadingcompany.h"
+#include "ui_leadingcompany.h"
+
+LeadingCompany::LeadingCompany(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::LeadingCompany)
+{
+    ui->setupUi(this);
+    ui->menubar->hide();
+    ui->statusbar->hide();
+
+    m_industryLeaderModel = new QStandardItemModel(this);
+    m_industryLeaderModel->setColumnCount(6);
+
+    m_trendLeaderModel = new QStandardItemModel(this);
+    m_trendLeaderModel->setColumnCount(7);
+
+    ui->tableView_industry->setModel(m_industryLeaderModel);
+    ui->tableView_trend->setModel(m_trendLeaderModel);
+
+    QStringList industryLabels;
+    industryLabels<<"鍚嶅瓧"<<"浠e彿"<<"琛屼笟"<<"绛夌骇"<<"甯傚��"<<"鏀剁洏浠�";
+    m_industryLeaderModel->setHorizontalHeaderLabels(industryLabels);
+
+    QStringList trendLabels;
+    trendLabels<<"鍚嶅瓧"<<"浠e彿"<<"瓒嬪娍鏂瑰悜"<<"琛屼笟"<<"绛夌骇"<<"甯傚��"<<"鏀剁洏浠�";
+    m_trendLeaderModel->setHorizontalHeaderLabels(trendLabels);
+
+}
+
+LeadingCompany::~LeadingCompany()
+{
+    delete ui;
+}
+
+void LeadingCompany::on_pushButton_add_clicked()
+{
+    QString name = ui->lineEdit_stockName->text();
+    QString code = ui->lineEdit_stockCode->text();
+    QString type = ui->comboBox->currentText();
+
+    // 娣诲姞鍒版暟鎹簱
+
+    // 娣诲姞鍒版枃鏈祻瑙堝櫒鏉ユ彁绀烘秷鎭�
+    ui->textBrowser->append(QString("%1 %2 %3").arg(type).arg(name).arg(code));
+}
diff --git a/leadingcompany.h b/leadingcompany.h
new file mode 100644
index 0000000..15eb8b5
--- /dev/null
+++ b/leadingcompany.h
@@ -0,0 +1,29 @@
+锘�#ifndef LEADINGCOMPANY_H
+#define LEADINGCOMPANY_H
+
+#include <QMainWindow>
+#include <QStandardItemModel>
+
+namespace Ui {
+class LeadingCompany;
+}
+
+class LeadingCompany : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit LeadingCompany(QWidget *parent = 0);
+    ~LeadingCompany();
+
+private slots:
+    void on_pushButton_add_clicked();
+
+private:
+    Ui::LeadingCompany *ui;
+
+    QStandardItemModel *m_industryLeaderModel; // 琛屼笟榫欏ご
+    QStandardItemModel *m_trendLeaderModel; // 瓒嬪娍榫欏ご
+};
+
+#endif // LEADINGCOMPANY_H
diff --git a/leadingcompany.ui b/leadingcompany.ui
new file mode 100644
index 0000000..10a6ea8
--- /dev/null
+++ b/leadingcompany.ui
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>LeadingCompany</class>
+ <widget class="QMainWindow" name="LeadingCompany">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>840</width>
+    <height>668</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QGridLayout" name="gridLayout">
+    <item row="0" column="0">
+     <widget class="QTabWidget" name="tabWidget">
+      <property name="currentIndex">
+       <number>2</number>
+      </property>
+      <widget class="QWidget" name="tab">
+       <attribute name="title">
+        <string>琛屼笟榫欏ご</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_2">
+        <item row="0" column="0">
+         <widget class="QTableView" name="tableView_industry"/>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_2">
+       <attribute name="title">
+        <string>瓒嬪娍榫欏ご</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_3">
+        <item row="0" column="0">
+         <widget class="QTableView" name="tableView_trend"/>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_3">
+       <attribute name="title">
+        <string>娣诲姞榫欏ご</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_4">
+        <item row="0" column="0">
+         <layout class="QHBoxLayout" name="horizontalLayout">
+          <item>
+           <widget class="QLabel" name="label">
+            <property name="text">
+             <string>榫欏ご绫诲瀷</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QComboBox" name="comboBox">
+            <item>
+             <property name="text">
+              <string>琛屼笟榫欏ご</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>瓒嬪娍榫欏ご</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLineEdit" name="lineEdit_stockName">
+            <property name="placeholderText">
+             <string>杈撳叆鑲$エ鍚嶅瓧</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLineEdit" name="lineEdit_stockCode">
+            <property name="placeholderText">
+             <string>杈撳叆鑲$エ浠e彿</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QPushButton" name="pushButton_add">
+            <property name="text">
+             <string>娣诲姞</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+        <item row="1" column="0">
+         <widget class="QTextBrowser" name="textBrowser"/>
+        </item>
+       </layout>
+      </widget>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>840</width>
+     <height>26</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..10f11bd
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,11 @@
+#include "clientmainwindow.h"
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    ClientMainWindow w;
+    w.show();
+
+    return a.exec();
+}
diff --git a/showinfomessage.cpp b/showinfomessage.cpp
new file mode 100644
index 0000000..5b7f01c
--- /dev/null
+++ b/showinfomessage.cpp
@@ -0,0 +1,19 @@
+锘�#include "showinfomessage.h"
+#include "ui_showinfomessage.h"
+
+ShowInfoMessage::ShowInfoMessage(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::ShowInfoMessage)
+{
+    ui->setupUi(this);
+}
+
+ShowInfoMessage::~ShowInfoMessage()
+{
+    delete ui;
+}
+
+void ShowInfoMessage::showInfo(QString info)
+{
+    ui->textBrowser->append(info);
+}
diff --git a/showinfomessage.h b/showinfomessage.h
new file mode 100644
index 0000000..36cdf58
--- /dev/null
+++ b/showinfomessage.h
@@ -0,0 +1,24 @@
+锘�#ifndef SHOWINFOMESSAGE_H
+#define SHOWINFOMESSAGE_H
+
+#include <QMainWindow>
+
+namespace Ui {
+class ShowInfoMessage;
+}
+
+class ShowInfoMessage : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit ShowInfoMessage(QWidget *parent = 0);
+    ~ShowInfoMessage();
+
+public slots:
+    void showInfo(QString info);
+private:
+    Ui::ShowInfoMessage *ui;
+};
+
+#endif // SHOWINFOMESSAGE_H
diff --git a/showinfomessage.ui b/showinfomessage.ui
new file mode 100644
index 0000000..d2b3ca9
--- /dev/null
+++ b/showinfomessage.ui
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ShowInfoMessage</class>
+ <widget class="QMainWindow" name="ShowInfoMessage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QGridLayout" name="gridLayout">
+    <item row="0" column="0">
+     <widget class="QTextBrowser" name="textBrowser"/>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>800</width>
+     <height>26</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/stock_plan.pro b/stock_plan.pro
new file mode 100644
index 0000000..339ec9f
--- /dev/null
+++ b/stock_plan.pro
@@ -0,0 +1,46 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2023-07-06T21:17:32
+#
+#-------------------------------------------------
+
+QT       += core gui network charts
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = stock_plan
+TEMPLATE = app
+
+# The following define makes your compiler emit warnings if you use
+# any feature of Qt which has been marked as deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if you use deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+
+SOURCES += \
+        main.cpp \
+        clientmainwindow.cpp \
+    getstocklist.cpp \
+    stockpolicy.cpp \
+    leadingcompany.cpp \
+    showinfomessage.cpp
+
+HEADERS += \
+        clientmainwindow.h \
+    getstocklist.h \
+    stockpolicy.h \
+    leadingcompany.h \
+    showinfomessage.h
+
+FORMS += \
+        clientmainwindow.ui \
+    getstocklist.ui \
+    stockpolicy.ui \
+    leadingcompany.ui \
+    showinfomessage.ui
diff --git a/stockpolicy.cpp b/stockpolicy.cpp
new file mode 100644
index 0000000..b84e4f4
--- /dev/null
+++ b/stockpolicy.cpp
@@ -0,0 +1,95 @@
+#include "stockpolicy.h"
+#include "ui_stockpolicy.h"
+#include <QDebug>
+#include <QLegendMarker>
+
+
+
+
+StockPolicy::StockPolicy(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::StockPolicy)
+{
+    ui->setupUi(this);
+    initUi();
+}
+
+StockPolicy::~StockPolicy()
+{
+    delete ui;
+}
+
+void StockPolicy::initUi()
+{
+
+    m_chart = new QChart;
+    m_chart->setTitle("瓒嬪娍鏌ョ湅");
+    m_chart->setBackgroundBrush(QColor(255,255,255));  // 鐢ㄤ簬璁剧疆鑳屾櫙鑹茬殑   QColor(10,10,10)  r,g,b 绾㈢豢钃�3鍘熻壊
+    QLineSeries *series = new QLineSeries; // 鐢ㄤ簬瀛樻斁鏁版嵁鐨勭郴鍒楋紝鐩稿綋浜庡瓨浜哫Y瀵瑰簲鏁版嵁鐨勫鍣�
+    series->setName("绀轰緥鍥�");
+
+    series->append(1686240000000,17.63); // X Y鐨勫��
+    series->append(1686844800000,19.31);
+    series->append(1687276800000,30.11);
+    series->append(1688054400000,19.31);
+    series->append(1688659200000,50.81);
+    m_chart->addSeries(series);
+
+    m_dtAx = new QDateTimeAxis;  // X杞达紝鏃堕棿杞�
+    m_dtAx->setFormat("yyyy-MM-dd"); // 璁剧疆鏃堕棿鏍煎紡
+    m_dtAx->setTitleText("鏃堕棿");
+    m_dtAx->setTickCount(10); // 璁剧疆缃戞牸鏁�
+    m_chart->setAxisX(m_dtAx,series);  // 璁剧疆 X杞翠负鏃堕棿杞淬�佹暟鎹�
+
+    m_axisY = new QValueAxis;  // Y杞�
+    m_axisY->setTickCount(10); // 璁剧疆鏍兼暟
+    m_axisY->setRange(0,1500); // 璁剧疆Y鍊肩殑鑼冨洿
+    m_chart->setAxisY(m_axisY,series);  // 璁剧疆 Y杞翠负鏁版嵁杞淬�佹暟鎹�
+
+    setLastMarkerShowAndAlpha(); // 璁剧疆褰撳墠鏈�鍚庝竴涓爣璁版洸绾垮拰鏍囩鐨勬樉绀哄強閫忔槑搴︽儏鍐�
+
+    m_chartView = new QChartView(m_chart);
+    // 妗嗛�夋斁澶э紝鍙抽敭缂╁皬
+    m_chartView->setRubberBand(QChartView::HorizontalRubberBand); // 璁剧疆榧犳爣宸﹀嚮妗嗛�夋斁澶э紝鍙冲嚮缂╁皬
+    m_chartView->setRenderHint(QPainter::Antialiasing,true);
+    this->setCentralWidget(m_chartView); // 灏嗚〃瑙嗗浘鏀惧埌涓績閮ㄤ欢鏉ユ樉绀猴紝鍙互鍋氬埌鑷�傚簲澶у皬
+}
+
+// 璁剧疆褰撳墠鏈�鍚庝竴涓爣璁版洸绾垮拰鏍囩鐨勬樉绀哄強閫忔槑搴︽儏鍐�
+void StockPolicy::setLastMarkerShowAndAlpha()
+{
+    QLegendMarker* marker = m_chart->legend()->markers().back();
+    connect(marker,QOverload<>::of(&QLegendMarker::clicked),this,[=]{
+        marker->series()->setVisible(!marker->series()->isVisible());  // 鍙栧弽锛屽彲瑙佹椂涓嶅彲瑙侊紝涓嶅彲瑙佹椂鍙樺彲瑙�
+        marker->setVisible(true); // 鎶婂浘渚嬫爣棰樻樉绀哄鐞�
+
+        qreal alpha = 1.0; // 閫忔槑搴︼紝瀹屽叏涓嶉�忔槑
+        if(!marker->series()->isVisible()) alpha = 0.5; // 涓嶅彲瑙佹椂閫忔槑搴� 50%
+        // 璁剧疆閫忔槑搴︾浉鍏筹紝涓昏鏄缃浘渚嬫爣绛剧殑閫忔槑搴�
+        QBrush brush = marker->labelBrush();
+        QColor color = brush.color();
+        color.setAlphaF(alpha);
+        brush.setColor(color);
+        marker->setLabelBrush(brush);
+    });
+}
+
+void StockPolicy::showNewStockData(QLineSeries *series)
+{
+
+    m_chart->addSeries(series);  // 娣诲姞鏁版嵁鍒板浘琛�
+    m_chart->setAxisX(m_dtAx,series);  // 璁剧疆 X杞翠负鏃堕棿杞淬�佹暟鎹�
+    m_chart->setAxisY(m_axisY,series);  // 璁剧疆 Y杞翠负鏁版嵁杞淬�佹暟鎹�
+    setLastMarkerShowAndAlpha(); // 璁剧疆褰撳墠鏈�鍚庝竴涓爣璁版洸绾垮拰鏍囩鐨勬樉绀哄強閫忔槑搴︽儏鍐�
+}
+
+void StockPolicy::showNewStockData(QSplineSeries *series)
+{
+    m_chart->addSeries(series);  // 娣诲姞鏁版嵁鍒板浘琛�
+    m_chart->setAxisX(m_dtAx,series);  // 璁剧疆 X杞翠负鏃堕棿杞淬�佹暟鎹�
+    m_chart->setAxisY(m_axisY,series);  // 璁剧疆 Y杞翠负鏁版嵁杞淬�佹暟鎹�
+    setLastMarkerShowAndAlpha(); // 璁剧疆褰撳墠鏈�鍚庝竴涓爣璁版洸绾垮拰鏍囩鐨勬樉绀哄強閫忔槑搴︽儏鍐�
+}
+
+
+
diff --git a/stockpolicy.h b/stockpolicy.h
new file mode 100644
index 0000000..5671e13
--- /dev/null
+++ b/stockpolicy.h
@@ -0,0 +1,41 @@
+#ifndef STOCKPOLICY_H
+#define STOCKPOLICY_H
+
+#include <QMainWindow>
+#include <QChartView>
+#include <QDateTimeAxis>
+#include <QValueAxis>
+#include <QChart>
+#include <QGraphicsSimpleTextItem>
+#include <QLineSeries>  // 鎶樼嚎
+#include <QSplineSeries> // 鏇茬嚎
+
+QT_CHARTS_USE_NAMESPACE  // 鍛藉悕绌洪棿寰椾娇鐢ㄨ捣鏉ワ紝瑕佷笉鐒剁被浼氭嬁涓嶅埌
+
+namespace Ui {
+class StockPolicy;
+}
+
+class StockPolicy : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit StockPolicy(QWidget *parent = 0);
+    ~StockPolicy();
+    void initUi();
+    void setLastMarkerShowAndAlpha(); // 璁剧疆褰撳墠鏈�鍚庝竴涓爣璁扮殑鏄剧ず鎯呭喌鍙婇�忔槑搴�
+public slots:
+    void showNewStockData(QLineSeries *series); // 鐢ㄤ簬鍒锋柊鎶樼嚎琛ㄦ牸鏁版嵁鐨�
+    void showNewStockData(QSplineSeries *series); // 鐢ㄤ簬鍒锋柊鏇茬嚎琛ㄦ牸鏁版嵁鐨�
+private:
+    Ui::StockPolicy *ui;
+
+    QChart *m_chart;
+    QDateTimeAxis *m_dtAx;
+    QValueAxis *m_axisY;
+    QChartView *m_chartView;
+
+};
+
+#endif // STOCKPOLICY_H
diff --git a/stockpolicy.ui b/stockpolicy.ui
new file mode 100644
index 0000000..64a683c
--- /dev/null
+++ b/stockpolicy.ui
@@ -0,0 +1,24 @@
+<ui version="4.0">
+ <author/>
+ <comment/>
+ <exportmacro/>
+ <class>StockPolicy</class>
+ <widget name="StockPolicy" class="QMainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget name="menubar" class="QMenuBar"/>
+  <widget name="centralwidget" class="QWidget"/>
+  <widget name="statusbar" class="QStatusBar"/>
+ </widget>
+ <pixmapfunction/>
+ <connections/>
+</ui>

--
Gitblit v1.8.0