diff --git a/TreasureFinder.pro b/TreasureFinder.pro index 660c6cc..3616233 100644 --- a/TreasureFinder.pro +++ b/TreasureFinder.pro @@ -10,14 +10,21 @@ CONFIG += c++11 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + db/xsqlexcute.cpp \ main.cpp \ - mainwindow.cpp + mainwindow.cpp \ + model/tradetablemodel.cpp \ + widget/addtradedialog.cpp HEADERS += \ - mainwindow.h + db/xsqlexcute.h \ + mainwindow.h \ + model/tradetablemodel.h \ + widget/addtradedialog.h FORMS += \ - mainwindow.ui + mainwindow.ui \ + widget/addtradedialog.ui win32-msvc2010 { SPEC = win32-msvc2010 @@ -35,6 +42,7 @@ CONFIG(debug, debug|release) { DESTDIR = $$PWD/$$SP_V/release } +TRANSLATIONS += treasurefinder_zh_CN.ts # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin diff --git a/db/xsqlexcute.cpp b/db/xsqlexcute.cpp new file mode 100644 index 0000000..45f5957 --- /dev/null +++ b/db/xsqlexcute.cpp @@ -0,0 +1,87 @@ +/*** + * 数据库操作类,单例模式 + * 只进行sql的执行,具体内容的解析业务侧进行 +*/ +#include "xsqlexcute.h" + +XSqlExcute* XSqlExcute::g_pSqlExc = NULL; +QMutex XSqlExcute::m_mutex; + +XSqlExcute::XSqlExcute(QObject *parent) : QObject(parent) +{ + +} + +XSqlExcute* XSqlExcute::instance() +{ + if (g_pSqlExc == NULL) + { + QMutexLocker locker(&m_mutex); // 加锁 + if (g_pSqlExc == NULL) + { + g_pSqlExc = new XSqlExcute(); + } + } + return g_pSqlExc; +} + +bool XSqlExcute::openMysql(const QString& hostName,const QString& databaseName,const QString& userName,const QString& password,const QString& connectionName) +{ + if(QSqlDatabase::contains(connectionName)) + { + return true; + } + else + { + QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",connectionName); + db.setHostName(hostName); + db.setDatabaseName(databaseName); + db.setUserName(userName); + db.setPassword(password); + return db.open(); + } +} + +bool XSqlExcute::closeMysql(const QString& connectionName) +{ + if(QSqlDatabase::contains(connectionName)) + QSqlDatabase::removeDatabase(connectionName); + return true; +} + +bool XSqlExcute::excuteSQL(const QString& sql,const QString& connectionName) +{ + QSqlQuery q(QSqlDatabase::database(connectionName)); + return q.exec(sql); +} + +//查询 +QSqlQuery XSqlExcute::query(const QString& sql,const QString& connectionName) +{ + QSqlQuery q(QSqlDatabase::database(connectionName)); + q.exec(sql); + return q; +} + +QSqlRecord XSqlExcute::record(const QString& sql,const QString& connectionName) +{ + QSqlQuery q(QSqlDatabase::database(connectionName)); + q.exec(sql); + QSqlRecord r = q.record(); + return r; +} + +//事务 +void XSqlExcute::transaction(const QString& connectionName) +{ + QSqlDatabase::database(connectionName).transaction(); +} + +void XSqlExcute::commit(const QString& connectionName) +{ + QSqlDatabase::database(connectionName).commit(); +} +void XSqlExcute::rollback(const QString& connectionName) +{ + QSqlDatabase::database(connectionName).rollback(); +} diff --git a/db/xsqlexcute.h b/db/xsqlexcute.h new file mode 100644 index 0000000..4a97423 --- /dev/null +++ b/db/xsqlexcute.h @@ -0,0 +1,40 @@ +#ifndef XSQLEXCUTE_H +#define XSQLEXCUTE_H + +#include +#include +#include +#include +#include + +class XSqlExcute : public QObject +{ + Q_OBJECT +public: + explicit XSqlExcute(QObject *parent = nullptr); + static XSqlExcute* instance(); + bool openMysql(const QString& hostName,const QString& databaseName,const QString& userName,const QString& password,const QString& connectionName); + bool closeMysql(const QString& connectionName); + //执行语句 + bool excuteSQL(const QString& sql,const QString& connectionName); + + //查询 + QSqlQuery query(const QString& sql,const QString& connectionName); + QSqlRecord record(const QString& sql,const QString& connectionName); + + //事务 + void transaction(const QString& connectionName); + void commit(const QString& connectionName); + void rollback(const QString& connectionName); + +signals: + +private: +// explicit XSqlExcute(QObject *parent = nullptr); +private: + static XSqlExcute* g_pSqlExc; + static QMutex m_mutex; + QSqlDatabase db; +}; + +#endif // XSQLEXCUTE_H diff --git a/main.cpp b/main.cpp index fd3e533..bb21a2f 100644 --- a/main.cpp +++ b/main.cpp @@ -1,11 +1,21 @@ #include "mainwindow.h" #include +#include int main(int argc, char *argv[]) { - QApplication a(argc, argv); + QApplication app(argc, argv); + QString appDir = QApplication::applicationDirPath(); + QTranslator translator; + + QString transPath = appDir + QLatin1String("/languages/") + "treasurefinder_zh_CN.qm"; + + if (translator.load(transPath)) + { + app.installTranslator(&translator); + } MainWindow w; w.show(); - return a.exec(); + return app.exec(); } diff --git a/mainwindow.cpp b/mainwindow.cpp index d33c424..5490c15 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2,18 +2,17 @@ #include "ui_mainwindow.h" #include #include +#include "widget/addtradedialog.h" +#include "model/tradetablemodel.h" +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); -// QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); -// db.setHostName("acidalia"); -// db.setDatabaseName("customdb"); -// db.setUserName("mojito"); -// db.setPassword("J0a1m8"); -// bool ok = db.open(); + this->setWindowTitle("mojin"); + InitTradeTable(); QStringList dbs = QSqlDatabase::drivers(); qDebug() << __FUNCTION__ << dbs; } @@ -23,3 +22,44 @@ MainWindow::~MainWindow() delete ui; } +void MainWindow::InitTradeTable() +{ + // m_pTradesModel = new TradeTableModel(ui->tradeTableView); + // m_pTradesModel->setColumnCount(3); + // m_pTradesModel->setHeaderData(0,Qt::Horizontal,"名称"); + // m_pTradesModel->setHeaderData(1,Qt::Horizontal,QDate::currentDate().toString("yyyy-MM-dd")); + // m_pTradesModel->setHeaderData(2,Qt::Horizontal,QDate::currentDate().addDays(-1).toString("yyyy-MM-dd")); + // ui->tradeTableView->setModel(m_pTradesModel); + + //日期 星期 名称 操作 价格 数量 当前持仓 操作时涨跌 操作后当日收盘情况 当日操作盈亏情况 当日操作盈亏比例 当日合计盈亏 当日合计盈亏比例 账户净资产 账户当日盈亏 账户当日盈亏比例 盈亏(卖出时计算) 盈亏比例(卖出时计算) 备注 + + QStringList heanders = QStringList() << tr("date") << tr("week") << tr("name") << tr("operate") << tr("operateprice") << tr("volume") + << tr("remainig") << tr("operatechange") << tr("close") << tr("operateprofit") << tr("totalprofit") + << tr("finalprofit") << tr("remark"); + + m_pTradeStandardModel = new QStandardItemModel(ui->tradeTableView); + m_pTradeStandardModel->setColumnCount(heanders.count()); + for(int i = 0 ; i < heanders.count(); i++) + { + m_pTradeStandardModel->setHeaderData(i,Qt::Horizontal,heanders[i]); + } + ui->tradeTableView->setModel(m_pTradeStandardModel); +} + + +void MainWindow::on_addTrade_pushButton_clicked() +{ + AddTradeDialog ad; + ad.setWindowTitle("添加记录"); + ad.exec(); + for (int row = 0; row < 4; ++row) + { + m_pTradeStandardModel->insertRow(row); + for (int column = 0; column < 3; ++column) { + QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column)); + m_pTradeStandardModel->setItem(row, column, item); + } + } + +} + diff --git a/mainwindow.h b/mainwindow.h index 4643e32..bce89f9 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -7,6 +7,8 @@ QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE +class TradeTableModel; +class QStandardItemModel; class MainWindow : public QMainWindow { Q_OBJECT @@ -15,7 +17,15 @@ public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); +private: + void InitTradeTable(); + +private slots: + void on_addTrade_pushButton_clicked(); + private: Ui::MainWindow *ui; +// TradeTableModel* m_pTradesModel; + QStandardItemModel* m_pTradeStandardModel; }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index c407c7a..9f6b72f 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -39,36 +39,119 @@ 交易记录 - - - - 10 - 50 - 741 - 761 - - - - - - - 780 - 50 - 601 - 271 - - - - - Tab 1 - - - - - Tab 2 - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 所有日期 + + + + + + + + + 自定 + + + + + + + + + + + + + + + + + + + + 确定 + + + + + + + + + + + 当前日期区间 + + + + + + + 20231209-20231209 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 添加记录 + + + + + + + + + + + diff --git a/model/tradetablemodel.cpp b/model/tradetablemodel.cpp new file mode 100644 index 0000000..6a00cb7 --- /dev/null +++ b/model/tradetablemodel.cpp @@ -0,0 +1,80 @@ +#include "tradetablemodel.h" + +TradeTableModel::TradeTableModel(QObject *parent) + : QAbstractTableModel(parent) +{ +} + +QVariant TradeTableModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + // FIXME: Implement me! +// return QVariant(); + if(role == Qt::DisplayRole && orientation == Qt::Horizontal) + return headerDatas[section]; + return QVariant(); +// return QAbstractTableModel::headerData(section,orientation,role); +} + +bool TradeTableModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, + int role /*= Qt::EditRole*/) +{ + headerDatas[section] = value.toString(); + return true; +} + +int TradeTableModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return m_datas.count(); + + // FIXME: Implement me! +} + +int TradeTableModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return m_nColumnCount; + // FIXME: Implement me! +} + +QVariant TradeTableModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + int row = index.row(); + int column = index.column(); + switch (role) + { + case Qt::DisplayRole: + return m_datas[row][column]; + } +// if (role != Qt::DisplayRole) +// return QVariant(); +// return m_datas[row][column]; + return QVariant(); +} + +void TradeTableModel::addData(int row,int column,QString data) +{ + if(m_nColumnCount <= column) + m_nColumnCount = column; + if(m_datas.count() <= row) + { + QList columns; + for(int c = 0 ; c < m_nColumnCount ; c++) + { + columns.append(""); + } + columns[column] = data; + m_datas.append(columns); + } + else + { + m_datas[row][column] = data; + } +} diff --git a/model/tradetablemodel.h b/model/tradetablemodel.h new file mode 100644 index 0000000..e329770 --- /dev/null +++ b/model/tradetablemodel.h @@ -0,0 +1,33 @@ +#ifndef TRADETABLEMODEL_H +#define TRADETABLEMODEL_H + +#include + +class TradeTableModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + explicit TradeTableModel(QObject *parent = nullptr); + + // Header: + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, + int role = Qt::EditRole) override; + // Basic functionality: + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + void setColumnCount(int count){m_nColumnCount = count;} + + void addData(int row,int column,QString data); +private: + QMap headerDatas; + QList > m_datas; + QList m_headers; + int m_nColumnCount = 0; +}; + +#endif // TRADETABLEMODEL_H diff --git a/treasurefinder_zh_CN.ts b/treasurefinder_zh_CN.ts new file mode 100644 index 0000000..8310a7a --- /dev/null +++ b/treasurefinder_zh_CN.ts @@ -0,0 +1,277 @@ + + + + + AddTradeDialog + + + Dialog + + + + + 添加记录 + + + + + 成交数量 + + + + + 成交价格 + + + + + + 成交金额 + + + + + + 剩余金额 + + + + + 佣金 + + + + + 印花税 + + + + + 过户费 + + + + + 其他费用 + + + + + + 交易备注 + + + + + + OK + + + + + + CANCEL + + + + + + 交易类型 + + + + + + 日期 + + + + + 证券名称 + + + + + 剩余数量 + + + + + + 证券代码 + + + + + 转账 + + + + + MainWindow + + + MainWindow + + + + + 动量趋势 + + + + + 新高新低 + + + + + 涨跌停板 + + + + + 交易记录 + + + + + 周 + + + + + 月 + + + + + 季 + + + + + 年 + + + + + 所有日期 + + + + + 自定 + + + + + 至 + + + + + 确定 + + + + + 当前日期区间 + + + + + 20231209-20231209 + + + + + 添加记录 + + + + + + 添加交易 + + + + + date + 日期 + 日期 + + + + week + 星期 + 星期 + + + + name + 证券名称 + 证券名称 + + + + operate + 操作 + 操作 + + + + operateprice + 操作价格 + 操作价格 + + + + volume + 操作数量 + 操作数量 + + + + remainig + 剩余数量 + 剩余数量 + + + + operatechange + 操作涨跌幅 + 操作涨跌幅 + + + + close + 收盘价 + 收盘价 + + + + operateprofit + 操作盈亏 + 操作盈亏 + + + + totalprofit + 收盘盈亏 + 收盘盈亏 + + + + finalprofit + 总盈亏 + 总盈亏 + + + + remark + 备注 + 备注 + + + diff --git a/widget/addtradedialog.cpp b/widget/addtradedialog.cpp new file mode 100644 index 0000000..ea2f88b --- /dev/null +++ b/widget/addtradedialog.cpp @@ -0,0 +1,40 @@ +#include "addtradedialog.h" +#include "ui_addtradedialog.h" +#include +#include +#include +#include + +AddTradeDialog::AddTradeDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::AddTradeDialog) +{ + ui->setupUi(this); +} + +AddTradeDialog::~AddTradeDialog() +{ + delete ui; +} + +void AddTradeDialog::on_pushButton_OK_clicked() +{ + QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","192"); + db.setHostName("192.168.0.222"); + db.setPort(3306); + db.setDatabaseName("mojin"); + db.setUserName("root"); + db.setPassword("1qazse42W3"); + bool ret = db.open(); + if(ret) + { + QMessageBox::about(this,"OPEN MYSQL","suc"); + } + else + { + QMessageBox::about(this,"OPEN MYSQL","failed"); + qDebug() << __FUNCTION__ << db.lastError(); + } + this->accept(); +} + diff --git a/widget/addtradedialog.h b/widget/addtradedialog.h new file mode 100644 index 0000000..38620ef --- /dev/null +++ b/widget/addtradedialog.h @@ -0,0 +1,25 @@ +#ifndef ADDTRADEDIALOG_H +#define ADDTRADEDIALOG_H + +#include + +namespace Ui { +class AddTradeDialog; +} + +class AddTradeDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AddTradeDialog(QWidget *parent = nullptr); + ~AddTradeDialog(); + +private slots: + void on_pushButton_OK_clicked(); + +private: + Ui::AddTradeDialog *ui; +}; + +#endif // ADDTRADEDIALOG_H diff --git a/widget/addtradedialog.ui b/widget/addtradedialog.ui new file mode 100644 index 0000000..af301e6 --- /dev/null +++ b/widget/addtradedialog.ui @@ -0,0 +1,320 @@ + + + AddTradeDialog + + + + 0 + 0 + 694 + 475 + + + + Dialog + + + + + + 0 + + + + 添加记录 + + + + + + 成交数量 + + + + + + + + + + 成交价格 + + + + + + + + + + 成交金额 + + + + + + + + + + 剩余金额 + + + + + + + + + + 佣金 + + + + + + + 印花税 + + + + + + + + + + 过户费 + + + + + + + + + + 其他费用 + + + + + + + + + + 交易备注 + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + CANCEL + + + + + + + + + + + + + 交易类型 + + + + + + + + + + 日期 + + + + + + + + + + 证券名称 + + + + + + + + + + 剩余数量 + + + + + + + + + + 证券代码 + + + + + + + + + + + 转账 + + + + + + 日期 + + + + + + + + + + 交易类型 + + + + + + + + + + 证券代码 + + + + + + + + + + 成交金额 + + + + + + + + + + 剩余金额 + + + + + + + + + + 交易备注 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + CANCEL + + + + + + + + + + + + + + + + + +