Qt写计算机协会值班签到系统
本文已被浏览14214次
计算机协会旧版的签到系统是用Flash+PHP使用Mysql数据库来写的.但是在使用过程中发现有些同学在签到的时候容易不小心的就关掉WAMP,于是Mysql和Apache就被干掉了,只剩下一个Flash根本没有办法和Mysql通信,开学纳新后,决定重新写一下V2.0版本
这个程序没有和其他设备共用数据库的必要,选用了SQLite,SQLite和Mysql类似,只是少了一些函数方面的功能,其他方面在SQLite3版本上和Mysql基本操作一样了.
这个程序设计了五个UI界面(关于,帮助,主窗口,值班窗口,管理窗口),这里只介绍后面三个界面.每个界面都有对应的cpp文件和.h头文件.
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>WorkingDialog</class> <widget class="QDialog" name="WorkingDialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>500</width> <height>200</height> </rect> </property> <property name="minimumSize"> <size> <width>500</width> <height>200</height> </size> </property> <property name="maximumSize"> <size> <width>500</width> <height>200</height> </size> </property> <property name="windowTitle"> <string>计算机协会电子签到系统-正在计时</string> </property> <property name="windowIcon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/Working.png</normaloff>:/Icons/Working.png</iconset> </property> <property name="windowOpacity"> <double>1.000000000000000</double> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QLabel" name="label"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>当前值班人:</string> </property> </widget> </item> <item> <widget class="QLabel" name="CurrentMan"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="whatsThis"> <string><html><head/><body><p>这里应该是您的名字,如果不是,请尽快结束计时重新选择姓名后再开始计时.</p></body></html></string> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="label_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>当前时间:</string> </property> </widget> </item> <item> <widget class="QLabel" name="Time"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> </layout> </item> <item> <widget class="QGroupBox" name="horizontalGroupBox_2"> <property name="font"> <font> <family>微软雅黑 Light</family> <pointsize>12</pointsize> </font> </property> <property name="title"> <string>已值班时间</string> </property> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="WorkingTime"> <property name="font"> <font> <family>微软雅黑 Light</family> <pointsize>36</pointsize> </font> </property> <property name="whatsThis"> <string><html><head/><body><p>这里显示您本次值班已经进行的时长.</p></body></html></string> </property> <property name="text"> <string>X小时XX分钟XX秒</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </widget> </item> <item> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <spacer name="horizontalSpacer_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="StopTimer"> <property name="font"> <font> <family>微软雅黑 Light</family> <pointsize>14</pointsize> </font> </property> <property name="whatsThis"> <string><html><head/><body><p>点击这里将结束本次值班的计时,本次值班记录将会记录进入数据库而无法再次开始,请确保值班时间达到标准后再点击这里!</p></body></html></string> </property> <property name="text"> <string>结束计时(&S)</string> </property> <property name="icon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/No.png</normaloff>:/Icons/No.png</iconset> </property> <property name="iconSize"> <size> <width>25</width> <height>25</height> </size> </property> </widget> </item> <item> <spacer name="horizontalSpacer_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="Exit"> <property name="font"> <font> <family>微软雅黑 Light</family> <pointsize>14</pointsize> </font> </property> <property name="whatsThis"> <string><html><head/><body><p>您可以先暂时关闭这个窗口,计时不会中止.在结束值班后请重新打开签到系统结束计时即可.</p></body></html></string> </property> <property name="text"> <string>临时关闭(&C)</string> </property> <property name="icon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/Exit.png</normaloff>:/Icons/Exit.png</iconset> </property> <property name="iconSize"> <size> <width>25</width> <height>25</height> </size> </property> </widget> </item> <item> <spacer name="horizontalSpacer_6"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </widget> <resources> <include location="Icons.qrc"/> </resources> <connections/> </ui>
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "WorkingDialog.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: WorkingDialog* Timer; explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void init(WorkingDialog* Timer); private slots: void on_About_triggered(); void on_Exit_triggered(); void on_StartTimer_clicked(); void on_SignList_doubleClicked(const QModelIndex &index); void on_ExportData_triggered(); void on_Manage_triggered(); void on_Help_triggered(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
#include "MainWindow.h" #include "ManageDialog.h" #include "ui_mainwindow.h" #include "WorkingDialog.h" #include "HelpDialog.h" #include "About.h" #include "Person.h" #include "SignUp.h" #include "PreDefineFunction.h" #include <QApplication> #include <QDebug> #include <QMessageBox> #include <QList> #include <QDateTime> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QAbstractItemView> #include <QFileDialog> #include <QProgressDialog> #include <QTextStream> #include <QInputDialog> extern QSqlQuery *sql; extern QSqlDatabase db; extern QList<Person> People; extern QList<SignUp> Signs; extern int CurrentPerson; extern int CurrentSign; MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); } MainWindow::~MainWindow(){ delete ui; } void MainWindow::init(WorkingDialog *Timer){ int i; this->Timer=Timer; if(Signs.count()<=0||Signs[Signs.count()-1].IsOver){ ui->PeoList->clear(); ui->PeoList->addItem("请选择一个姓名"); for(i=0;i<People.count();i++){ ui->PeoList->addItem(People.at(i).Name); } QString Head; QList<QString> Content; if(Signs.count()>0){ QString temp; int Dist; int Hour; int Min; int Sec; QDateTime Btemp,Etemp; Head="姓名,开始时间,结束时间,值班时长"; for(i=0;i<Signs.count();i++){ Btemp.setTime_t(Signs[i].Begin); Etemp.setTime_t(Signs[i].End); temp = Signs[i].Name+","; temp += Btemp.toString("yyyy年MM月dd日 HH:mm:ss")+","; temp += Etemp.toString("yyyy年MM月dd日 HH:mm:ss")+","; Dist=Signs[i].End-Signs[i].Begin; Sec=Dist%60; Dist=(Dist-Sec)/60; Min=Dist%60; Hour=(Dist-Min)/60; if(Hour>0) temp+=(Hour<10?"0":"")+QString::number(Hour)+"小时"; if(Min>0) temp+=(Min<10?"0":"")+QString::number(Min)+"分钟"; temp+=(Sec<10?"0":"")+QString::number(Sec)+"秒"; Content.append(temp); } }else{ Head="没有签到数据!"; Content.append("你是第一个哦~~"); } fillTable(ui->SignList,Head,Content,QAbstractItemView::SingleSelection); ui->SignList->resizeColumnsToContents(); this->show(); }else{ CurrentSign=Signs.count()-1; this->Timer->init(this); } } void MainWindow::on_About_triggered(){ About AD; AD.exec(); } void MainWindow::on_Exit_triggered(){ int confirm=QMessageBox::question(this,"退出","确定要退出么?",QMessageBox::Yes,QMessageBox::No); if(confirm==QMessageBox::Yes){ this->hide(); exit(0); } } void MainWindow::on_StartTimer_clicked(){ int select=ui->PeoList->currentIndex()-1; if(select<0){ QMessageBox::warning(this,"警告","请选择一个姓名!"); return; } int confirm=QMessageBox::question(this,"询问","请确认以下信息:n值班人:"+People[select].Name,QMessageBox::Ok,QMessageBox::Cancel); if(confirm!=QMessageBox::Ok){ return; } CurrentPerson=select; CurrentSign=Signs.count(); SignUp stemp; stemp.Begin=QDateTime::currentDateTime().toTime_t(); stemp.End=0; stemp.IsOver=false; stemp.Name=People[select].Name; stemp.lid=CurrentSign>=1?Signs[CurrentSign-1].lid+1:0; Signs.append(stemp); sql->exec("INSERT INTO SignUp VALUES ("+QString::number(stemp.lid)+",'"+stemp.Name+"',"+QString::number(stemp.Begin)+",0,0)"); this->hide(); this->Timer->init(this); } void MainWindow::on_SignList_doubleClicked(const QModelIndex &index){ int select=index.row(); if(select==Signs.count()) return; QString Content; QDateTime Btemp,Etemp; int Dist,Sec,Min,Hour; Btemp.setTime_t(Signs[select].Begin); Etemp.setTime_t(Signs[select].End); Content = "值班人:"+Signs[select].Name+"n"; Content += "开始时间:"+Btemp.toString("yyyy年MM月dd日 HH:mm:ss")+"n"; Content += "结束时间:"+Etemp.toString("yyyy年MM月dd日 HH:mm:ss")+"n"; Content += "值班时长:"; Dist=Signs[select].End-Signs[select].Begin; Sec=Dist%60; Dist=(Dist-Sec)/60; Min=Dist%60; Hour=(Dist-Min)/60; if(Hour>0) Content+=(Hour<10?"0":"")+QString::number(Hour)+"小时"; if(Min>0) Content+=(Min<10?"0":"")+QString::number(Min)+"分钟"; Content+=(Sec<10?"0":"")+QString::number(Sec)+"秒"; QMessageBox::information(this,"值班记录",Content); } void MainWindow::on_ExportData_triggered(){ if(Signs.count()<=0){ QMessageBox::warning(this,"错误!","当前数据库中不存在任何值班记录"); return; } QString Target; Target=QFileDialog::getSaveFileName(this,"导出数据至",QDir::currentPath(),"CSV 表格(*.csv)"); if(Target.isEmpty()) return; QFile file(Target); if(!file.open(QIODevice::WriteOnly)){ QMessageBox::critical(this,"错误","当前目录不可写,请检查后重试!"); return; } QTextStream out(&file); QStringList Head; Head<<"#"<<"姓名"<<"值班开始时间"<<"值班结束时间"<<"值班时长"; QProgressDialog dialog(tr("正在导出数据..."),tr("取消"),0,(Signs.count()+1)*5,this); int MainPrg=0; dialog.setWindowTitle(tr("导出进度")); dialog.setWindowModality(Qt::WindowModal); dialog.show(); for(int i=0;i<Head.count();i++,MainPrg++){ dialog.setValue(MainPrg); QCoreApplication::processEvents(); out<<Head[i]+(Head.count()-1!=i?",":""); if(dialog.wasCanceled()){ file.close(); QFile::remove(Target); QMessageBox::warning(this,"提示","导出操作被中止!"); return; } } out<<"n"; for(int i=0;i<Signs.count();i++){ QStringList temp=Signs[i].toTableUnit(i+1); for(int j=0;j<temp.count();j++,MainPrg++){ dialog.setValue(MainPrg); QCoreApplication::processEvents(); out<<temp[j]+(j+1!=temp.count()?",":""); if(dialog.wasCanceled()){ file.close(); QFile::remove(Target); QMessageBox::warning(this,"提示","导出操作被中止!"); return; } } out<<"n"; } dialog.setValue(MainPrg); QMessageBox::information(this,"成功!","成功导出"+QString::number(Signs.count())+"条记录"); } void MainWindow::on_Manage_triggered(){ QString Password=getMD5(QInputDialog::getText(this,"管理密码","请输入管理员密码:",QLineEdit::Password)); sql->exec("Select 1 From options where key_name='mng_pwd' AND key_value='"+Password+"';"); if(!sql->next()){ QMessageBox::critical(this,"错误","管理员密码错误!"); return; } ManageDialog MD; MD.init(); this->init(this->Timer); } void MainWindow::on_Help_triggered(){ HelpDialog HD; HD.exec(); }
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>WorkingDialog</class> <widget class="QDialog" name="WorkingDialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>500</width> <height>200</height> </rect> </property> <property name="minimumSize"> <size> <width>500</width> <height>200</height> </size> </property> <property name="maximumSize"> <size> <width>500</width> <height>200</height> </size> </property> <property name="windowTitle"> <string>计算机协会电子签到系统-正在计时</string> </property> <property name="windowIcon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/Working.png</normaloff>:/Icons/Working.png</iconset> </property> <property name="windowOpacity"> <double>1.000000000000000</double> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QLabel" name="label"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>当前值班人:</string> </property> </widget> </item> <item> <widget class="QLabel" name="CurrentMan"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="whatsThis"> <string><html><head/><body><p>这里应该是您的名字,如果不是,请尽快结束计时重新选择姓名后再开始计时.</p></body></html></string> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="label_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>当前时间:</string> </property> </widget> </item> <item> <widget class="QLabel" name="Time"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> </layout> </item> <item> <widget class="QGroupBox" name="horizontalGroupBox_2"> <property name="font"> <font> <family>微软雅黑 Light</family> <pointsize>12</pointsize> </font> </property> <property name="title"> <string>已值班时间</string> </property> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="WorkingTime"> <property name="font"> <font> <family>微软雅黑 Light</family> <pointsize>36</pointsize> </font> </property> <property name="whatsThis"> <string><html><head/><body><p>这里显示您本次值班已经进行的时长.</p></body></html></string> </property> <property name="text"> <string>X小时XX分钟XX秒</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </widget> </item> <item> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <spacer name="horizontalSpacer_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="StopTimer"> <property name="font"> <font> <family>微软雅黑 Light</family> <pointsize>14</pointsize> </font> </property> <property name="whatsThis"> <string><html><head/><body><p>点击这里将结束本次值班的计时,本次值班记录将会记录进入数据库而无法再次开始,请确保值班时间达到标准后再点击这里!</p></body></html></string> </property> <property name="text"> <string>结束计时(&S)</string> </property> <property name="icon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/No.png</normaloff>:/Icons/No.png</iconset> </property> <property name="iconSize"> <size> <width>25</width> <height>25</height> </size> </property> </widget> </item> <item> <spacer name="horizontalSpacer_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="Exit"> <property name="font"> <font> <family>微软雅黑 Light</family> <pointsize>14</pointsize> </font> </property> <property name="whatsThis"> <string><html><head/><body><p>您可以先暂时关闭这个窗口,计时不会中止.在结束值班后请重新打开签到系统结束计时即可.</p></body></html></string> </property> <property name="text"> <string>临时关闭(&C)</string> </property> <property name="icon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/Exit.png</normaloff>:/Icons/Exit.png</iconset> </property> <property name="iconSize"> <size> <width>25</width> <height>25</height> </size> </property> </widget> </item> <item> <spacer name="horizontalSpacer_6"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </widget> <resources> <include location="Icons.qrc"/> </resources> <connections/> </ui>
#ifndef WORKINGDIALOG_H #define WORKINGDIALOG_H #include <QDialog> #include <QTimer> namespace Ui { class WorkingDialog; } class MainWindow; class WorkingDialog : public QDialog { Q_OBJECT public: explicit WorkingDialog(QWidget *parent = 0); MainWindow* Main; ~WorkingDialog(); QTimer* timer; void init(MainWindow* Main); private slots: void on_StopTimer_clicked(); void showTime(); void on_Exit_clicked(); private: Ui::WorkingDialog *ui; }; #endif // WORKINGDIALOG_H
#include "WorkingDialog.h" #include "ui_workingdialog.h" #include "MainWindow.h" #include "SignUp.h" #include "Person.h" #include <QSqlError> #include <QTimer> #include <QDebug> #include <QDateTime> #include <QMessageBox> extern QSqlQuery *sql; extern QSqlDatabase db; extern QList<Person> People; extern QList<SignUp> Signs; extern int CurrentPerson; extern int CurrentSign; WorkingDialog::WorkingDialog(QWidget *parent) : QDialog(parent), ui(new Ui::WorkingDialog){ ui->setupUi(this); } WorkingDialog::~WorkingDialog(){ delete ui; } void WorkingDialog::init(MainWindow* Main){ this->Main=Main; ui->CurrentMan->setText(Signs[CurrentSign].Name); this->timer=new QTimer(this); QObject::connect(timer,SIGNAL(timeout()),this,SLOT(showTime())); timer->start(100); this->show(); } void WorkingDialog::showTime(){ unsigned CurrentTime=QDateTime::currentDateTime().toTime_t(); int Dist=CurrentTime-Signs[CurrentSign].Begin; int Hour; int Min; int Sec; Sec=Dist%60; Dist=(Dist-Sec)/60; Min=Dist%60; Hour=(Dist-Min)/60; QString Tip; if(Hour>0) Tip+=(Hour<10?"0":"")+QString::number(Hour)+"小时"; if(Min>0) Tip+=(Min<10?"0":"")+QString::number(Min)+"分钟"; Tip+=(Sec<10?"0":"")+QString::number(Sec)+"秒"; ui->WorkingTime->setText(Tip); ui->Time->setText(QDateTime::currentDateTime().toString("hh:mm:ss a")); } void WorkingDialog::on_StopTimer_clicked(){ if(QMessageBox::question(this,"询问?","确定现在终止计时?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) return; Signs[CurrentSign].End=QDateTime::currentDateTime().toTime_t(); Signs[CurrentSign].IsOver=true; sql->exec("Update SignUp Set End="+QString::number(Signs[CurrentSign].End)+",IsOver=1 Where lid="+QString::number(Signs[CurrentSign].lid)); this->timer->stop(); this->hide(); this->Main->init(this); } void WorkingDialog::on_Exit_clicked(){ QMessageBox::information(this,"提示","请在离开值班室之前重新打开点击计时结束,否则将会影响下一位值班同学的签到!"); exit(0); }
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>ManageDialog</class> <widget class="QDialog" name="ManageDialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>600</width> <height>400</height> </rect> </property> <property name="minimumSize"> <size> <width>600</width> <height>400</height> </size> </property> <property name="maximumSize"> <size> <width>600</width> <height>400</height> </size> </property> <property name="windowTitle"> <string>系统设置</string> </property> <property name="windowIcon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/Settings.png</normaloff>:/Icons/Settings.png</iconset> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="horizontalGroupBox1"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="title"> <string>数据库操作</string> </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QPushButton" name="Clear"> <property name="whatsThis"> <string><html><head/><body><p>此功能将会清除所有的值班记录,请确保所有的记录已经完全导出后再执行此项!</p></body></html></string> </property> <property name="text"> <string>请空已有值班记录</string> </property> <property name="icon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/clear.png</normaloff>:/Icons/clear.png</iconset> </property> </widget> </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>10</height> </size> </property> </spacer> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="horizontalGroupBox_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="title"> <string>值班人员管理</string> </property> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QListWidget" name="PeoList"> <property name="maximumSize"> <size> <width>150</width> <height>16777215</height> </size> </property> <property name="whatsThis"> <string><html><head/><body><p>当前值班人员列表.</p></body></html></string> </property> </widget> </item> <item> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QGroupBox" name="horizontalGroupBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="title"> <string>添加</string> </property> <layout class="QHBoxLayout" name="horizontalLayout_4"> <property name="leftMargin"> <number>5</number> </property> <property name="topMargin"> <number>5</number> </property> <property name="rightMargin"> <number>5</number> </property> <property name="bottomMargin"> <number>5</number> </property> <item> <widget class="QLabel" name="label"> <property name="text"> <string>姓名:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="PeoName"> <property name="whatsThis"> <string><html><head/><body><p>新增人员名称,必填</p></body></html></string> </property> </widget> </item> <item> <widget class="QPushButton" name="Add"> <property name="whatsThis"> <string><html><head/><body><p>添加新的值班人员</p></body></html></string> </property> <property name="text"> <string>添加</string> </property> <property name="icon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/Add.png</normaloff>:/Icons/Add.png</iconset> </property> </widget> </item> </layout> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_5"> <item> <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Fixed</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="Remove"> <property name="whatsThis"> <string><html><head/><body><p>删除左侧已经被选中的姓名.</p></body></html></string> </property> <property name="text"> <string>删除</string> </property> <property name="icon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/Erase.png</normaloff>:/Icons/Erase.png</iconset> </property> </widget> </item> <item> <spacer name="horizontalSpacer_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Fixed</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="horizontalGroupBox_3"> <property name="title"> <string>管理员密码设置</string> </property> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QLabel" name="label_2"> <property name="text"> <string>旧密码:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="Pwd1"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="whatsThis"> <string><html><head/><body><p>修改密码时输入您的旧密码.</p></body></html></string> </property> <property name="echoMode"> <enum>QLineEdit::Password</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_3"> <property name="text"> <string>新密码:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="Pwd2"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="whatsThis"> <string><html><head/><body><p>这里输入您的新密码</p></body></html></string> </property> <property name="echoMode"> <enum>QLineEdit::Password</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_4"> <property name="text"> <string>重复新密码:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="Pwd3"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="whatsThis"> <string><html><head/><body><p>重复前面的密码</p></body></html></string> </property> <property name="echoMode"> <enum>QLineEdit::Password</enum> </property> </widget> </item> <item> <widget class="QPushButton" name="ChangePwd"> <property name="toolTipDuration"> <number>-1</number> </property> <property name="whatsThis"> <string><html><head/><body><p>执行修改密码操作</p></body></html></string> </property> <property name="text"> <string>修改</string> </property> <property name="icon"> <iconset resource="Icons.qrc"> <normaloff>:/Icons/Unlock.png</normaloff>:/Icons/Unlock.png</iconset> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> <resources> <include location="Icons.qrc"/> </resources> <connections/> </ui>
#ifndef MANAGEDIALOG_H #define MANAGEDIALOG_H #include <QDialog> namespace Ui { class ManageDialog; } class ManageDialog : public QDialog { Q_OBJECT public: explicit ManageDialog(QWidget *parent = 0); ~ManageDialog(); void init(); private slots: void on_Clear_clicked(); void on_Remove_clicked(); void on_Add_clicked(); void on_ChangePwd_clicked(); private: Ui::ManageDialog *ui; }; #endif // MANAGEDIALOG_H
#include "ManageDialog.h" #include "ui_ManageDialog.h" #include "Person.h" #include "SignUp.h" #include "PreDefineFunction.h" #include <QApplication> #include <QMessageBox> #include <QDebug> #include <QSqlError> extern QSqlQuery *sql; extern QSqlDatabase db; extern QList<Person> People; extern QList<SignUp> Signs; extern int CurrentPerson; extern int CurrentSign; ManageDialog::ManageDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ManageDialog) { ui->setupUi(this); } void ManageDialog::init(){ if(People.count()<=0){ ui->PeoList->addItem("目前列表为空!"); }else{ for(int i=0;i<People.count();i++){ ui->PeoList->addItem(People[i].Name); } } this->exec(); } ManageDialog::~ManageDialog() { delete ui; } void ManageDialog::on_Clear_clicked(){ if(QMessageBox::warning(this,"询问","确定要清除所有值班记录?n请在导出数据后再执行此项!",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) return; sql->exec("Delete From SignUp"); Signs.clear(); QMessageBox::information(this,"提示","清除成功!"); } void ManageDialog::on_Remove_clicked(){ int selected=ui->PeoList->currentRow(); if(selected<0){ QMessageBox::warning(this,"错误","请选择要删除的项目!"); return; } if(QMessageBox::question(this,"删除","确定要删除"+People[selected].Name+"吗?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) return; ui->PeoList->takeItem(selected); sql->exec("Delete from Person where pid="+QString::number(People[selected].pid)); People.removeAt(selected); QMessageBox::information(this,"提示","删除成功!"); } void ManageDialog::on_Add_clicked(){ if(ui->PeoName->text().isEmpty()){ QMessageBox::warning(this,"错误","请输入要添加的姓名!"); return; } Person temp(NULL); temp.Name=ui->PeoName->text(); temp.pid=People[People.count()-1].pid+1; sql->exec("Insert into Person values(NULL,'"+temp.Name+"')"); People.append(temp); ui->PeoList->addItem(temp.Name); ui->PeoName->setText(""); } void ManageDialog::on_ChangePwd_clicked(){ QString Pwd1=ui->Pwd1->text(); QString Pwd2=ui->Pwd2->text(); QString Pwd3=ui->Pwd3->text(); if(Pwd1.isEmpty()){ QMessageBox::warning(this,"错误","请输入旧密码!"); return; }else if(Pwd2.isEmpty()){ QMessageBox::warning(this,"错误","请输入新密码!"); return; }else if(Pwd2!=Pwd3){ QMessageBox::warning(this,"错误","两次输入的新密码不同!"); return; } Pwd1=getMD5(Pwd1); Pwd2=getMD5(Pwd2); sql->exec("Select 1 From options where key_name='mng_pwd' AND key_value='"+Pwd1+"'"); if(!sql->next()){ QMessageBox::warning(this,"错误","旧密码错误!"); return; } sql->exec("Update options set key_value='"+Pwd2+"' Where key_name='mng_pwd'"); QMessageBox::information(this,"提示","修改成功!"); }
另外还有两个文件,用于定义了一下一些预定义的函数和类
#include <QApplication> #include <QTableView> #include <QStandardItemModel> #include <QHeaderView> #include <QCryptographicHash> void fillTable(QTableView *Target,QString Title,QStringList Content,QAbstractItemView::SelectionMode mode){ QStandardItemModel *Table_model = new QStandardItemModel(); QStringList SplitTitle=Title.split(","); QStringList SplitRow; int i; for(i=0;i<SplitTitle.count();i++){ Table_model->setHorizontalHeaderItem(i, new QStandardItem(SplitTitle[i])); } int rowid=0; foreach(QString SingleRow,Content){ SplitRow=SingleRow.split(","); for(i=0;i<SplitRow.count();i++){ Table_model->setItem(rowid, i, new QStandardItem(SplitRow[i])); } rowid++; } //利用setModel()方法将数据模型与QTableView绑定 Target->setModel(Table_model); Target->horizontalHeader()->setStretchLastSection(true); Target->setSelectionMode(mode); Target->setEditTriggers(QAbstractItemView::NoEditTriggers); Target->setSelectionBehavior(QAbstractItemView::SelectRows); } QList<int> getTableViewSelected(QTableView *Target){ QModelIndexList Selected=Target->selectionModel()->selectedRows(); QList<int> Select; foreach(QModelIndex single,Selected){ Select.append(single.row()); } return Select; } QString getMD5(QString Password){ QString md5; QByteArray ba,bb; QCryptographicHash md(QCryptographicHash::Md5); ba.append(Password); md.addData(ba); bb = md.result(); md5.append(bb.toHex()); return md5; }
class Person{ public: QString Name; int pid; Person(QSqlQuery *sql); }; class SignUp{ public: int lid; QString Name; unsigned Begin; unsigned End; bool IsOver; SignUp(); void Prepare(QSqlQuery *sql); QStringList toTableUnit(int index); }; Person::Person(QSqlQuery *sql){ if(sql==NULL) return; this->Name=sql->value("Name").toString(); this->pid=sql->value("pid").toInt(); } SignUp::SignUp(){ } void SignUp::Prepare(QSqlQuery *sql){ this->lid=sql->value("lid").toInt(); this->Name=sql->value("name").toString(); this->Begin=sql->value("Begin").toUInt(); this->End=sql->value("End").toUInt(); this->IsOver=sql->value("IsOver").toBool(); } QStringList SignUp::toTableUnit(int index){ QStringList temp; QDateTime B,E; B.setTime_t(this->Begin); E.setTime_t(this->End); temp<<QString::number(index); temp<<this->Name; temp<<B.toString("yyyy年MM月dd日 HH:mm:ss"); temp<<E.toString("yyyy年MM月dd日 HH:mm:ss"); int Dist,Sec,Min,Hour; QString Time; Dist=this->End-this->Begin; Sec=Dist%60; Dist=(Dist-Sec)/60; Min=Dist%60; Hour=(Dist-Min)/60; if(Hour>0) Time+=(Hour<10?"0":"")+QString::number(Hour)+"小时"; if(Min>0) Time+=(Min<10?"0":"")+QString::number(Min)+"分钟"; Time+=(Sec<10?"0":"")+QString::number(Sec)+"秒"; temp<<Time; return temp; }
最后,本程序开源,可以做任何研究,其中算法可以直接移作他用,如非计算机协会需要使用此签到系统,请联系站长,谢谢!
评论
您需要 先登录 才可以回复.