📂
Qt
  • 【Qt Quick 编程指南】
  • 第一篇 基本应用篇
    • 第1章 Qt Creator简介
      • 1.1 注意事项说明
      • 1.2 Qt Creator 是什么
      • 1.2 IDE集成开发环境准备
      • 1.3 Qt Creator 环境介绍
      • 1.4 Qt工具简介
      • 1.5 Git的使用
    • 第2章 Qt Quick
      • 2.1 Qt Quick 是什么
      • 2.2 Qt Quick 能做什么
      • 2.3 QML支持的平台
      • 2.3 第一个Qt Quick程序
    • 第3章 Hello World
      • 2.1 编写Hello World 程序
      • 2.2 程序的运行与发布
      • 2.3 Hello World程序源码与编译过程详解
      • 2.4 项目模式和项目文件介绍
    • 第4章 窗口部件
      • 3.1 基础窗口部件QWidget
      • 3.2 对话框QDialog
      • 3.3 其他窗口部件
    • 第5章 布局管理
      • 4.1 布局管理系统
      • 4.2 设置伙伴
      • 4.3 设置Tab键顺序
      • 4.4 Qt Creator中的定位器
      • 4.5 案例-登录窗口布局
    • 第6章 应用程序主窗口
      • 5.1 主窗口框架
      • 5.2 富文本处理
      • 5.3 拖放操作
      • 5.4 打印文档
    • 第7章 事件系统
      • 6.1 Qt中的事件
      • 6.2 鼠标事件和滚轮事件
      • 6.4 定时器事件与随机数
      • 6.5 事件过滤器与事件的发送
    • 第8章 Qt对象模型与容器类
      • 7.1 对象模型
      • 7.2 容器类
      • 7.1 对象模型
      • 7.3 正则表达式
      • 7.2 容器类
      • 7.3 正则表达式
    • 第9章 界面外观
      • 8.1 Qt风格
      • 8.2 Qt样式表
      • 8.1 Qt风格
      • 8.3 特殊效果窗体
      • 8.2 Qt样式表
      • 8.3 特殊效果窗口
    • 第10章 国际化、帮助系统与Qt插件
      • 9.1 国际化
      • 9.2 帮助系统
      • 9.3 创建Qt插件
  • 第二篇 图形动画篇
    • 第11章 2D绘图
      • 10.1 基本绘制和填充
      • 10.2 坐标系统
      • 10.3 其他绘制
      • 10.4 双缓冲绘图
      • 10.5 绘图中的其他问题
    • 第12章 图形视图、动画和状态机框架
      • 11.1 图形视图、动画和状态机框架
      • 11.2 图形视图框架的坐标系统和事件
      • 11.3 图形视图框架的其他特性
      • 11.4 动画框架
      • 11.5 状态机框架
    • 第13章 3D绘图
      • 12.1 使用OpenGL绘制图形介绍
      • 12.2 绘制多边形
      • 12.3 绘制彩色3D图形
      • 12.4 使用纹理贴图
  • 第三篇 影音媒体篇
    • 第14章 音视频播放
      • 13.1 播放音频
      • 13.2 播放视频
      • 13.3 QmediaPlayer
    • 第15章 相机和音频录制
      • 14.1 使用相机
      • 14.2 使用音频
  • 第四篇 数据处理篇
    • 第16章 文件、目录和输入/输出
      • 15.1 文件和目录
      • 15.2 文本流和数据流
      • 15.3 其他相关类
    • 第17章 模型/视图编程
      • 16.1 模型/视图架构
      • 16.2 模型类
      • 16.3 视图类
      • 16.4 委托类
      • 16.5 项目视图的便捷类
      • 16.6 在项目视图中启用拖放
    • 第18章 数据库和XML
      • 17.1 数据库
      • 17.2 XML
  • 第五篇 网络通信篇
    • 第19章 网络编程
      • 18.1 网络访问接口
      • 18.2 获取网络接口信息
      • 18.3 UDP
      • 18.4 TCP
    • 第20章 进程和线程
      • 19.1 进程
      • 19.2 线程
    • 第21章 Qt WebEngine
      • 20.1 Qt WebEngine
      • 20.2 基于Qt WebEngine Widget的网页浏览器
  • ※Qt6 QML 实战手册※
    • 第一章 基础设置
      • 1.1 项目注释
      • 1.2 修改程序名字
      • 1.3 程序打包
      • 1.4 Qt Design Studio 结合 Qt Creator使用
      • 1.5 版本控制(GitHub)
    • 第二章 项目文件详解
      • 2.1 CMakeLists.txt
    • 第三章 UI设计
      • 3.1 常用控件大全
    • 第十章 多媒体 Multimedia
    • 异常集合总结
  • ※项目案例※
    • ZSLinux开发
    • DCShell开发
    • DCSft开发
    • Qt程序打包
    • BarTenderPrinter
    • 自动补卡考勤程序
    • 打卡机客户端程序
    • SQL考勤补卡脚本
    • 编译 libssh2
  • 常用知识点总结
    • 【Qt+QML+CMake 开发学习进度】
    • Qt6 开发知识点总结
    • Qt creator 快捷键
    • Qt Design Studio 控件大全
    • QT中添加图片资源文件
    • Qt Creator配合Qt Design Studio
    • 学习参考资料
由 GitBook 提供支持
在本页
  • 一、项目需求
  • 二、背景环境
  • 三、实现步骤

这有帮助吗?

  1. ※项目案例※

自动补卡考勤程序

一、项目需求

通过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("等待状态!")

                }

            }

        }


    }


上一页BarTenderPrinter下一页打卡机客户端程序

最后更新于5个月前

这有帮助吗?