372 lines
21 KiB
C++
372 lines
21 KiB
C++
#include "mainwindow.h"
|
|
#include "ui_mainwindow.h"
|
|
#include "Modules/global.h"
|
|
#include "Modules/socketactions.h"
|
|
#include "Modules/Logger.h"
|
|
#include "Modules/methods.h"
|
|
#include <Windows.h>
|
|
#include <QLabel>
|
|
#include <QTextEdit>
|
|
#include <QTableWidget>
|
|
#include <QComboBox>
|
|
#include <string>
|
|
|
|
structTableWidget tableWidget;
|
|
structComboBox comboBox;
|
|
extern structUserInfo userInfo;
|
|
extern structLabel label;
|
|
extern structPushButton pushButton;
|
|
extern structTextEdit textEdit;
|
|
extern structUserInfo userInfo;
|
|
extern structSession session;
|
|
|
|
using std::string;
|
|
using std::to_string;
|
|
|
|
MainWindow::MainWindow(QWidget *parent)
|
|
: QMainWindow(parent)
|
|
, ui(new Ui::MainWindow)
|
|
{
|
|
ui->setupUi(this);
|
|
QLabel *sb_label_currentUser = new QLabel(("Current User: " + userInfo.userName).c_str(), this);
|
|
sb_label_currentUser->setMinimumWidth(100);
|
|
label.salaryActual = findChild<QLabel*>("label_salaryActual");
|
|
label.salaryDiscount = findChild<QLabel*>("label_salaryDiscount");
|
|
label.salaryShould = findChild<QLabel*>("label_salaryShould");
|
|
textEdit.search = findChild<QTextEdit*>("textEdit_search");
|
|
pushButton.clear = findChild<QPushButton*>("pushButton_clear");
|
|
pushButton.seacrh = findChild<QPushButton*>("pushButton_search");
|
|
pushButton.submit = findChild<QPushButton*>("pushButton_submit");
|
|
pushButton.remove = findChild<QPushButton*>("pushButton_remove");
|
|
comboBox.findBy = findChild<QComboBox*>("comboBox_findBy");
|
|
tableWidget.teacherInfo = findChild<QTableWidget*>("tableWidget_teacherInfo");
|
|
tableWidget.teacherSalary = findChild<QTableWidget*>("tableWidget_teacherSalary");
|
|
|
|
ui->statusbar->addWidget(sb_label_currentUser);
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void MainWindow::on_pushButton_search_clicked()
|
|
{
|
|
struct structSearch{
|
|
QString method;
|
|
QString content;
|
|
} search;
|
|
|
|
struct structTeacherInfo{
|
|
string id;
|
|
string name;
|
|
string gender;
|
|
string company;
|
|
string address;
|
|
string tel;
|
|
} teacherInfo;
|
|
|
|
struct structSalaryInfo{
|
|
string id;
|
|
string basicSalary;
|
|
string allowances;
|
|
string livingAllowances;
|
|
string phoneCost;
|
|
string waterPowerCost;
|
|
string incomeTax;
|
|
string houseRent;
|
|
string cleaningCost;
|
|
string houseingFund;
|
|
} salaryInfo;
|
|
|
|
struct structSalary{
|
|
int should;
|
|
int discount;
|
|
int actual;
|
|
} salary;
|
|
|
|
string searchResult = "";
|
|
search.method = comboBox.findBy->currentText();
|
|
search.content = textEdit.search->toPlainText();
|
|
if(search.method.isEmpty() && search.content.isEmpty()){
|
|
MessageBoxA(NULL, "Search method or context can't be empty.", "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
} else {
|
|
if(search.method == "ID"){
|
|
searchResult = sockAct::tcpSend("[userGet] <userID>" + session.userID + "</userID> <userName>" + session.userName + "</userName> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp()) + "</timeStamp> <table>teacherInfo</table> <itemID>" + search.content.toStdString() + "</itemID> <valueType>all</valueType>");
|
|
postLog("[method.search] " + searchResult, 0);
|
|
if(getTextMiddle(searchResult, "[", "]") == "Get_Rejected"){
|
|
::MessageBoxA(NULL, ("Failed to get data. Reason: " + searchResult.substr(searchResult.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
} else {
|
|
teacherInfo.id = getTextMiddle(searchResult, "<itemID>", "</itemID>");
|
|
teacherInfo.name = getTextMiddle(searchResult, "<teacherName>", "</teacherName>");
|
|
teacherInfo.gender = getTextMiddle(searchResult, "<gender>", "</gender>");
|
|
teacherInfo.company = getTextMiddle(searchResult, "<companyName>", "</companyName>");
|
|
teacherInfo.address = getTextMiddle(searchResult, "<address>", "</address>");
|
|
teacherInfo.tel = getTextMiddle(searchResult, "<tel>", "</tel>");
|
|
|
|
tableWidget.teacherInfo->setItem(0, 0, new QTableWidgetItem(QString::fromStdString(teacherInfo.id)));
|
|
tableWidget.teacherInfo->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(teacherInfo.name)));
|
|
tableWidget.teacherInfo->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(teacherInfo.gender)));
|
|
tableWidget.teacherInfo->setItem(0, 3, new QTableWidgetItem(QString::fromStdString(teacherInfo.company)));
|
|
tableWidget.teacherInfo->setItem(0, 4, new QTableWidgetItem(QString::fromStdString(teacherInfo.address)));
|
|
tableWidget.teacherInfo->setItem(0, 5, new QTableWidgetItem(QString::fromStdString(teacherInfo.tel)));
|
|
}
|
|
|
|
searchResult = sockAct::tcpSend("[userGet] <userID>" + session.userID + "</userID> <userName>" + session.userName + "</userName> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp()) + "</timeStamp> <table>salaryForm</table> <itemID>" + search.content.toStdString() + "</itemID> <valueType>all</valueType>");
|
|
postLog("[method.search] " + searchResult, 0);
|
|
if(getTextMiddle(searchResult, "[", "]") == "Get_Rejected"){
|
|
::MessageBoxA(NULL, ("Failed to get data. Reason: " + searchResult.substr(searchResult.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
} else {
|
|
salaryInfo.id = getTextMiddle(searchResult, "<itemID>", "</itemID>");
|
|
salaryInfo.basicSalary = getTextMiddle(searchResult, "<basicSalary>", "</basicSalary>");
|
|
salaryInfo.allowances = getTextMiddle(searchResult, "<allowances>", "</allowances>");
|
|
salaryInfo.cleaningCost = getTextMiddle(searchResult, "<cleaningCost>", "</cleaningCost>");
|
|
salaryInfo.phoneCost = getTextMiddle(searchResult, "<phoneCost>", "</phoneCost>");
|
|
salaryInfo.waterPowerCost = getTextMiddle(searchResult, "<waterPowerCost>", "</waterPowerCost>");
|
|
salaryInfo.houseRent = getTextMiddle(searchResult, "<houseRent>", "</houseRent>");
|
|
salaryInfo.incomeTax = getTextMiddle(searchResult, "<incomeTax>", "</incomeTax>");
|
|
salaryInfo.livingAllowances = getTextMiddle(searchResult, "<livingAllowances>", "</livingAllowances>");
|
|
salaryInfo.houseingFund = getTextMiddle(searchResult, "<housingFund>", "</housingFund>");
|
|
|
|
tableWidget.teacherSalary->setItem(0, 0, new QTableWidgetItem(QString::fromStdString(salaryInfo.basicSalary)));
|
|
tableWidget.teacherSalary->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(salaryInfo.allowances)));
|
|
tableWidget.teacherSalary->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(salaryInfo.livingAllowances)));
|
|
tableWidget.teacherSalary->setItem(0, 3, new QTableWidgetItem(QString::fromStdString(salaryInfo.phoneCost)));
|
|
tableWidget.teacherSalary->setItem(0, 4, new QTableWidgetItem(QString::fromStdString(salaryInfo.waterPowerCost)));
|
|
tableWidget.teacherSalary->setItem(0, 5, new QTableWidgetItem(QString::fromStdString(salaryInfo.houseRent)));
|
|
tableWidget.teacherSalary->setItem(0, 6, new QTableWidgetItem(QString::fromStdString(salaryInfo.incomeTax)));
|
|
tableWidget.teacherSalary->setItem(0, 7, new QTableWidgetItem(QString::fromStdString(salaryInfo.cleaningCost)));
|
|
tableWidget.teacherSalary->setItem(0, 8, new QTableWidgetItem(QString::fromStdString(salaryInfo.houseingFund)));
|
|
|
|
salary.should = stoi(salaryInfo.basicSalary) + stoi(salaryInfo.allowances) + stoi(salaryInfo.livingAllowances);
|
|
salary.discount = stoi(salaryInfo.phoneCost) + stoi(salaryInfo.waterPowerCost) + stoi(salaryInfo.houseRent) + stoi(salaryInfo.incomeTax) + stoi(salaryInfo.cleaningCost) + stoi(salaryInfo.houseingFund);
|
|
salary.actual = salary.should - salary.discount;
|
|
label.salaryShould->setText(QString::fromStdString("应发工资: " + to_string(salary.should)));
|
|
label.salaryDiscount->setText(QString::fromStdString("合计扣款: " + to_string(salary.discount)));
|
|
label.salaryActual->setText(QString::fromStdString("实发工资: " + to_string(salary.actual)));
|
|
}
|
|
}
|
|
if(search.method == "Name"){
|
|
searchResult = sockAct::tcpSend("[userGet] <userID>" + session.userID + "</userID> <userName>" + session.userName + "</userName> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp()) + "</timeStamp> <table>teacherInfo</table> <itemID>" + search.content.toStdString() + "</itemID> <valueType>all</valueType>");
|
|
postLog("[method.search] " + searchResult, 0);
|
|
if(searchResult == "[Get_Rejected] ItemID does not exist."){
|
|
MessageBoxA(NULL, "Target item not found.", "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
} else {
|
|
if(getTextMiddle(searchResult, "[", "]") == "Get_Rejected"){
|
|
::MessageBoxA(NULL, ("Failed to get data. Reason: " + searchResult.substr(searchResult.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
} else {
|
|
teacherInfo.id = getTextMiddle(searchResult, "<itemID>", "</itemID>");
|
|
teacherInfo.name = getTextMiddle(searchResult, "<teacherName>", "</teacherName>");
|
|
teacherInfo.gender = getTextMiddle(searchResult, "<gender>", "</gender>");
|
|
teacherInfo.company = getTextMiddle(searchResult, "<companyName>", "</companyName>");
|
|
teacherInfo.address = getTextMiddle(searchResult, "<address>", "</address>");
|
|
teacherInfo.tel = getTextMiddle(searchResult, "<tel>", "</tel>");
|
|
|
|
tableWidget.teacherInfo->setItem(0, 0, new QTableWidgetItem(QString::fromStdString(teacherInfo.id)));
|
|
tableWidget.teacherInfo->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(teacherInfo.name)));
|
|
tableWidget.teacherInfo->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(teacherInfo.gender)));
|
|
tableWidget.teacherInfo->setItem(0, 3, new QTableWidgetItem(QString::fromStdString(teacherInfo.company)));
|
|
tableWidget.teacherInfo->setItem(0, 4, new QTableWidgetItem(QString::fromStdString(teacherInfo.address)));
|
|
tableWidget.teacherInfo->setItem(0, 5, new QTableWidgetItem(QString::fromStdString(teacherInfo.tel)));
|
|
}
|
|
|
|
searchResult = sockAct::tcpSend("[userGet] <userID>" + session.userID + "</userID> <userName>" + session.userName + "</userName> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp()) + "</timeStamp> <table>salaryForm</table> <itemID>" + search.content.toStdString() + "</itemID> <valueType>all</valueType>");
|
|
postLog("[method.search] " + searchResult, 0);
|
|
if(getTextMiddle(searchResult, "[", "]") == "Get_Rejected"){
|
|
::MessageBoxA(NULL, ("Failed to get data. Reason: " + searchResult.substr(searchResult.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
} else {
|
|
salaryInfo.basicSalary = getTextMiddle(searchResult, "<basicSalary>", "</basicSalary>");
|
|
salaryInfo.cleaningCost = getTextMiddle(searchResult, "<cleaningCost>", "</cleaningCost>");
|
|
salaryInfo.phoneCost = getTextMiddle(searchResult, "<phoneCost>", "</phoneCost>");
|
|
salaryInfo.waterPowerCost = getTextMiddle(searchResult, "<waterPowerCost>", "</waterPowerCost>");
|
|
salaryInfo.houseRent = getTextMiddle(searchResult, "<houseRent>", "</houseRent>");
|
|
salaryInfo.incomeTax = getTextMiddle(searchResult, "<incomeTax>", "</incomeTax>");
|
|
salaryInfo.allowances = getTextMiddle(searchResult, "<allowances>", "</allowances>");
|
|
salaryInfo.livingAllowances = getTextMiddle(searchResult, "<livingAllowances>", "</livingAllowances>");
|
|
salaryInfo.houseingFund = getTextMiddle(searchResult, "<housingFund>", "</housingFund>");
|
|
|
|
tableWidget.teacherSalary->setItem(0, 0, new QTableWidgetItem(QString::fromStdString(salaryInfo.basicSalary)));
|
|
tableWidget.teacherSalary->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(salaryInfo.allowances)));
|
|
tableWidget.teacherSalary->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(salaryInfo.livingAllowances)));
|
|
tableWidget.teacherSalary->setItem(0, 3, new QTableWidgetItem(QString::fromStdString(salaryInfo.phoneCost)));
|
|
tableWidget.teacherSalary->setItem(0, 4, new QTableWidgetItem(QString::fromStdString(salaryInfo.waterPowerCost)));
|
|
tableWidget.teacherSalary->setItem(0, 5, new QTableWidgetItem(QString::fromStdString(salaryInfo.houseRent)));
|
|
tableWidget.teacherSalary->setItem(0, 6, new QTableWidgetItem(QString::fromStdString(salaryInfo.incomeTax)));
|
|
tableWidget.teacherSalary->setItem(0, 7, new QTableWidgetItem(QString::fromStdString(salaryInfo.cleaningCost)));
|
|
tableWidget.teacherSalary->setItem(0, 8, new QTableWidgetItem(QString::fromStdString(salaryInfo.houseingFund)));
|
|
|
|
salary.should = stoi(salaryInfo.basicSalary) + stoi(salaryInfo.allowances) + stoi(salaryInfo.livingAllowances);
|
|
salary.discount = stoi(salaryInfo.phoneCost) + stoi(salaryInfo.waterPowerCost) + stoi(salaryInfo.houseRent) + stoi(salaryInfo.incomeTax) + stoi(salaryInfo.cleaningCost) + stoi(salaryInfo.houseingFund);
|
|
salary.actual = salary.should - salary.discount;
|
|
label.salaryShould->setText(QString::fromStdString("应发工资: " + to_string(salary.should)));
|
|
label.salaryDiscount->setText(QString::fromStdString("合计扣款: " + to_string(salary.discount)));
|
|
label.salaryActual->setText(QString::fromStdString("实发工资: " + to_string(salary.actual)));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void MainWindow::on_pushButton_submit_clicked()
|
|
{
|
|
struct structTeacherInfo{
|
|
string id = tableWidget.teacherInfo->item(0, 0)->text().toStdString();
|
|
string name = tableWidget.teacherInfo->item(0, 1)->text().toStdString();
|
|
string gender = tableWidget.teacherInfo->item(0, 2)->text().toStdString();
|
|
string company = tableWidget.teacherInfo->item(0, 3)->text().toStdString();
|
|
string address = tableWidget.teacherInfo->item(0, 4)->text().toStdString();
|
|
string tel = tableWidget.teacherInfo->item(0, 5)->text().toStdString();
|
|
} teacherInfo;
|
|
|
|
struct structSalaryInfo{
|
|
string id = tableWidget.teacherInfo->item(0, 0)->text().toStdString();
|
|
string basicSalary = tableWidget.teacherSalary->item(0, 0)->text().toStdString();
|
|
string allowances = tableWidget.teacherSalary->item(0, 1)->text().toStdString();
|
|
string livingAllowances = tableWidget.teacherSalary->item(0, 2)->text().toStdString();
|
|
string phoneCost = tableWidget.teacherSalary->item(0, 3)->text().toStdString();
|
|
string waterPowerCost = tableWidget.teacherSalary->item(0, 4)->text().toStdString();
|
|
string incomeTax = tableWidget.teacherSalary->item(0, 6)->text().toStdString();
|
|
string houseRent = tableWidget.teacherSalary->item(0, 5)->text().toStdString();
|
|
string cleaningCost = tableWidget.teacherSalary->item(0, 7)->text().toStdString();
|
|
string houseingFund = tableWidget.teacherSalary->item(0, 8)->text().toStdString();
|
|
} salaryInfo;
|
|
|
|
if(teacherInfo.id == "" && teacherInfo.name == ""){
|
|
MessageBoxA(NULL, "Name or ID can't be empty.", "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
} else {
|
|
for(int i = 0; i < 6; i++){
|
|
string nowColumn;
|
|
string nowItem;
|
|
switch (i){
|
|
case 0:
|
|
nowColumn = "teacherID";
|
|
nowItem = teacherInfo.id;
|
|
break;
|
|
case 1:
|
|
nowColumn = "teacherName";
|
|
nowItem = teacherInfo.name;
|
|
break;
|
|
case 2:
|
|
nowColumn = "gender";
|
|
nowItem = teacherInfo.gender;
|
|
break;
|
|
case 3:
|
|
nowColumn = "companyName";
|
|
nowItem = teacherInfo.company;
|
|
break;
|
|
case 4:
|
|
nowColumn = "address";
|
|
nowItem = teacherInfo.address;
|
|
break;
|
|
case 5:
|
|
nowColumn = "tel";
|
|
nowItem = teacherInfo.tel;
|
|
break;
|
|
}
|
|
string resp = sockAct::tcpSend("[userSet] <userID>" + session.userID + "</userID> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp())+ "</timeStamp> <table>teacherInfo</table> <itemID>" + teacherInfo.id + "</itemID> <valueType>" + nowColumn + "</valueType> <value>" + nowItem + "</value>");
|
|
}
|
|
for(int i = 0; i < 11; i++){
|
|
string nowColumn;
|
|
string nowItem;
|
|
switch (i){
|
|
case 0:
|
|
nowColumn = "teacherID";
|
|
nowItem = teacherInfo.id;
|
|
break;
|
|
case 1:
|
|
nowColumn = "teacherName";
|
|
nowItem = teacherInfo.name;
|
|
break;
|
|
case 2:
|
|
nowColumn = "basicSalary";
|
|
nowItem = salaryInfo.basicSalary;
|
|
break;
|
|
case 3:
|
|
nowColumn = "allowances";
|
|
nowItem = salaryInfo.allowances;
|
|
break;
|
|
case 4:
|
|
nowColumn = "livingAllowances";
|
|
nowItem = salaryInfo.livingAllowances;
|
|
break;
|
|
case 5:
|
|
nowColumn = "phoneCost";
|
|
nowItem = salaryInfo.phoneCost;
|
|
break;
|
|
case 6:
|
|
nowColumn = "waterPowerCost";
|
|
nowItem = salaryInfo.waterPowerCost;
|
|
break;
|
|
case 7:
|
|
nowColumn = "houseRent";
|
|
nowItem = salaryInfo.houseRent;
|
|
break;
|
|
case 8:
|
|
nowColumn = "incomeTax";
|
|
nowItem = salaryInfo.incomeTax;
|
|
break;
|
|
case 9:
|
|
nowColumn = "cleaningCost";
|
|
nowItem = salaryInfo.cleaningCost;
|
|
break;
|
|
case 10:
|
|
nowColumn = "housingFund";
|
|
nowItem = salaryInfo.houseingFund;
|
|
break;
|
|
}
|
|
string resp = sockAct::tcpSend("[userSet] <userID>" + session.userID + "</userID> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp())+ "</timeStamp> <table>salaryForm</table> <itemID>" + teacherInfo.id + "</itemID> <valueType>" + nowColumn + "</valueType> <value>" + nowItem + "</value>");
|
|
}
|
|
MessageBoxA(NULL, "Submitted.", "Info", MB_OK|MB_ICONINFORMATION);
|
|
}
|
|
}
|
|
|
|
|
|
void MainWindow::on_pushButton_remove_clicked()
|
|
{
|
|
struct structTeacherInfo{
|
|
string id = tableWidget.teacherInfo->item(0, 0)->text().toStdString();
|
|
string name = tableWidget.teacherInfo->item(0, 1)->text().toStdString();
|
|
string gender = tableWidget.teacherInfo->item(0, 2)->text().toStdString();
|
|
string company = tableWidget.teacherInfo->item(0, 3)->text().toStdString();
|
|
string address = tableWidget.teacherInfo->item(0, 4)->text().toStdString();
|
|
string tel = tableWidget.teacherInfo->item(0, 5)->text().toStdString();
|
|
} teacherInfo;
|
|
string resp = sockAct::tcpSend("[userDel] <userID>" + session.userID + "</userID> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp())+ "</timeStamp> <table>teacherInfo</table> <itemID>" + teacherInfo.id + "</itemID>");
|
|
if (getTextMiddle(resp, "[", "]") == "Del_Rejected"){
|
|
postLog("[method.del] Failed to remove due to " + resp.substr(resp.find_first_of(' ')), 3);
|
|
::MessageBoxA(NULL, ("Failed to remove item. Reason: " + resp.substr(resp.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
} else {
|
|
string resp = sockAct::tcpSend("[userDel] <userID>" + session.userID + "</userID> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp())+ "</timeStamp> <table>salaryForm</table> <itemID>" + teacherInfo.id + "</itemID>");
|
|
if (getTextMiddle(resp, "[", "]") == "Del_Rejected"){
|
|
postLog("[method.del] Failed to remove due to " + resp.substr(resp.find_first_of(' ')), 3);
|
|
::MessageBoxA(NULL, ("Failed to remove item. Reason: " + resp.substr(resp.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
|
|
return;
|
|
}
|
|
}
|
|
MessageBoxA(NULL, "Remove successfully.", "Info", MB_OK|MB_ICONINFORMATION);
|
|
}
|
|
|
|
|
|
void MainWindow::on_pushButton_clear_clicked()
|
|
{
|
|
for(int i = 0; i < 6; i++){
|
|
tableWidget.teacherInfo->setItem(0, i, new QTableWidgetItem(""));
|
|
}
|
|
for(int i = 0; i < 10; i++){
|
|
tableWidget.teacherSalary->setItem(0, i, new QTableWidgetItem(""));
|
|
}
|
|
label.salaryShould->setText(QString::fromStdString("应发工资: "));
|
|
label.salaryDiscount->setText(QString::fromStdString("合计扣款: "));
|
|
label.salaryActual->setText(QString::fromStdString("实发工资: "));
|
|
}
|
|
|