自动补卡考勤程序
一、项目需求
通过Qt开发一个实现自动在数据库中插入打卡数据的程序
二、背景环境
数据库:Sql Server
编程工具:QtQuick(QML) + C++
三、实现步骤
设置 ODBC 数据源(64 位)-->系统DSN-->添加
CMakeLists.txt,其中
cmake_minimum_required(VERSION 3.16)
project(XSabre VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#增加 sql模块
find_package(Qt6 6.2 COMPONENTS Quick REQUIRED Sql)
#添加源文件和头文件
qt_add_executable(appXSabre
main.cpp
sqlddl.h
sqlddl.cpp
)
qt_add_qml_module(appXSabre
URI XSabre
VERSION 1.0
QML_FILES main.qml
)
set_target_properties(appXSabre PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
target_compile_definitions(appXSabre
PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
#添加 Qt6::Sql
target_link_libraries(appXSabre
PRIVATE Qt6::Quick Qt6::Sql)
添加命名为sqlddl的C++ Class,生成sqlddl.h和sqlddl.cpp两个文件
sqlddl.h
#ifndef SQLDDL_H
#define SQLDDL_H
#include <QObject>
class sqlddl : public QObject
{
Q_OBJECT
public:
explicit sqlddl(QObject *parent = nullptr);
Q_INVOKABLE void execsql();
signals:
};
#endif // SQLDDL_H
sqlddl.cpp,其中敏感信息已经用x代替
#include "sqlddl.h"
//引入库文件
#include <QtSql/QSqlDatabase>
#include<QtSql/QSqlDriver>
#include<QtSql/QSqlError>
#include<QDebug>
#include<QtSql/QSqlQuery>
#include<QString>
#include<sqlopen.h>
sqlddl::sqlddl(QObject *parent)
: QObject{parent}
{
}
void sqlddl::execsql()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug ()<< "sql driver "<< db.isValid();
//db.setHostName("192.168.x.x");
db.setHostName("192.168.x.x,x");
//设置数据源名称
db.setDatabaseName("KYSOFT_RenShi");
db.setUserName("sa");
//db.setPassword("x");
db.setPassword("x");
db.open();
if(!db.open())
{
qDebug()<<db.lastError();
}
else
{
qDebug()<<"数据库连接成功!";
//插入语句
QSqlQuery query;
//旧语句,可以成功执行无工号,作为备份("insert into KQ_KaoQin_MX (BH_EMP,BH_Card,RIQI,Times,Address,ID,Type,BH_Bu,DATA,Trans,strpic,FileName,OK_PIC,RdCardTime)values('读卡成功','0011268861',CONVERT(varchar, GETDATE(), 23),substring( convert(varchar,getdate(),120),1,16),232,0,0,'',CONVERT(varchar, getdate(),120 )+' 0011268861 232','0', ' ', replace(replace(replace(replace(CAST(CONVERT(varchar(100), GETDATE(), 120) as datetime2(2)),'-',''),' ','-'),':',''),'.',''), '0', ' ')"))
if(!query.exec("insert into KQ_KaoQin_MX (BH_EMP,BH_Card,RIQI,Times,Address,ID,Type,BH_Bu,DATA,Trans,strpic,FileName,OK_PIC,RdCardTime)values('201910004','0011268861',CONVERT(varchar, GETDATE(), 23),substring( convert(varchar,getdate(),120),1,16),232,0,0,'',CONVERT(varchar, getdate(),120 )+' 0011268861 232','0', ' ', replace(replace(replace(replace(CAST(CONVERT(varchar(100), GETDATE(), 120) as datetime2(2)),'-',''),' ','-'),':',''),'.',''), '0', ' ')"))
{
qDebug() << query.lastError();
}
else
{
qDebug() << "恭喜,插入语句执行成功!";
}
}
db.close();
QSqlDatabase::removeDatabase("QODBC");
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QSqlDatabase>
#include <QSqlError>
#include <sqlddl.h>
#include <QQmlContext>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
const QUrl url(u"qrc:/XSabre/main.qml"_qs);
//将C++中的类注册到QML中
qmlRegisterType<sqlddl,1>("Sqlddl",1,0,"Sqlddl");
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
main.qml
import QtQuick
import QtQuick.Controls
import Sqlddl
Window {
width: 640
height: 480
visible: true
title: qsTr("自动打卡考勤程序")
Item {
Text {
id: time
font.pixelSize: 24
}
Text {
id: txtstatus
x: 300
font.pixelSize: 24
text: qsTr("状态")
}
Sqlddl {
id:sqldl
}
Button {
x:50
y:50
width: 100
height: 50
text: qsTr("插入按钮")
onClicked: {
sqldl.execsql()
}
}
}
Timer {
interval: 1000; running: true; repeat: true
onTriggered: {
time.text = Qt.formatDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")
var d1 = '07:35:00'
var d2 = '12:05:00'
var d3 = '13:05:00'
var d4 = '17:35:00'
//var d6 = '22:08:00'
var d5 = Qt.formatDateTime(new Date(), "hh:mm:ss")
console.log(d5)
//console.log(typeof(d5))
//console.log(typeof(d1))
if ( d5===d1 || d5===d2 || d5===d3 || d5===d4 ){
txtstatus.text="正在插入..."
console.log("执行插入语句")
//调用数据库插入函数
sqldl.execsql()
}else{
txtstatus.text="等待执行插入中..."
console.log("等待状态!")
}
}
}
}
最后更新于
这有帮助吗?