📂
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. ※项目案例※

BarTenderPrinter

上一页Qt程序打包下一页自动补卡考勤程序

最后更新于17天前

这有帮助吗?

(一)项目需求

在BarTender软件中负责价格牌标签的布局,并在BarTender中连接到SQL Server 数据库中,实现通过QT开发一个系统对数据库信息实现增删改查。

(二)效果展示

(三)实现步骤

(1)、数据库设计

数据库名:pricedb,表名:priceinfo

设计表

列名
数据类型
允许为Null值

caizhi

varchar(50)

√

chandi

varchar(50)

√

danjia

varchar(50)

√

guige

varchar(50)

√

pinming

varchar(50)

√

xinghao

varchar(50)

√

xiushi

varchar(50)

√

yanse

varchar(50)

√

(2)、新建BarTenderPrinter项目,类型选择widget

(3)、UI布局如下:

  1. 拖拽一个QLabel控件到父窗口上,并双击QLabel控件编辑内容:XX红木价格牌录入专用系统

  2. 拖拽一个QTableView到父窗口上

  3. 拖拽8个QLabel到父窗口上,并分别命名为:材质、产地、价格、规格、品名、型号、颜色、修饰,再拖拽8个QLineEdit控件,分别与8个QLabel做水平对应布局

  4. 拖拽4个QPushButton控件到父窗口,分别命名为:增加记录,删除当前记录,修改记录,清空所有记录

(4)、QT项目BarTenderPrinter文件内容如下:

#-------------------------------------------------
#
# Project created by QtCreator 2021-08-13T10:27:15
#
#-------------------------------------------------

QT       += core gui sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = BarTenderPrinter
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11

SOURCES += \
        main.cpp \
        widget.cpp

HEADERS += \
        widget.h

FORMS += \
        widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RC_ICONS = 001.ico

(5)、在头文件widget.h中的内容如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QString>
#include<QSqlDatabase>
#include<QSqlQuery>
#include<QDebug>
#include<QMessageBox>
#include<QSqlError>
#include<QLabel>
#include<QSqlQueryModel>
#include<QItemSelectionModel>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_add_clicked();

    void on_pushButton_4_clicked();

    void on_update_clicked();

    void on_tableView_clicked(const QModelIndex &index);

    void on_del_clicked();

private:
    Ui::Widget *ui;
    QSqlQuery *query;
    QSqlQueryModel *qmodel;
};

#endif // WIDGET_H

(6)、源文件widget.cpp的内容如下:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //打印所支持的驱动
    qDebug() << QSqlDatabase::drivers();

    //添加SQLServer数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    //连接SQLServer数据库
    db.setHostName("192.168.10.10"); //数据库服务器IP
    db.setUserName("admin"); //数据库登录账号
    db.setPassword("passwd"); //数据库登录密码
    db.setDatabaseName("databasename"); //连接的数据库名称,此处为pricedb
    db.open();
    query = new QSqlQuery();
    query->exec("create table priceinfo(caizhi varchar(50),chandi varchar(50),danjia varchar(50),guige varchar(50),pinming varchar(50),xinghao varchar(50),xiushi varchar(50),yanse varchar(50))");

    //打开数据库

    if(!db.open())

    {
       QMessageBox::warning(this,"错误提示",db.lastError().text());
       return;

    }

    qmodel = new QSqlQueryModel();

    qmodel->setQuery("select caizhi ,chandi , danjia  ,guige   , pinming  , xinghao  , xiushi  , yanse   from priceinfo");
    ui->tableView->setModel(qmodel);
    //注意设置表头的位置,并且这样的方式比sql语句设置的方式好,SQL语句的方式只能是一次,后面会变化
    qmodel->setHeaderData(0,Qt::Horizontal,"材质");
    qmodel->setHeaderData(1,Qt::Horizontal,"产地");
    qmodel->setHeaderData(2,Qt::Horizontal,"单价");
    qmodel->setHeaderData(3,Qt::Horizontal,"规格");
    qmodel->setHeaderData(4,Qt::Horizontal,"品名");
    qmodel->setHeaderData(5,Qt::Horizontal,"型号");
    qmodel->setHeaderData(6,Qt::Horizontal,"修饰");
    qmodel->setHeaderData(7,Qt::Horizontal,"颜色");

ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //数据列宽度自适应, 横向填满表格
ui->tableView->scrollToBottom();
//    if (db.open())
//    {

//        QMessageBox::about(this,"连接成功提示","数据库连接成功");

//    }
//    else
//    {
//        QMessageBox::warning(this,"错误",db.lastError().text());
//        return;
//    }

}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_add_clicked()
{
//    材质 lineEdit
//    产地 lineEdit_2
//    价格 lineEdit_3
//    规格 lineEdit_4
//    品名 lineEdit_5
//    型号 lineEdit_6
//    修饰 lineEdit_7
//    颜色 lineEdit_8

    QString caizhi = ui->lineEdit->text();
    QString chandi = ui->lineEdit_2->text();
    QString danjia = ui->lineEdit_3->text();
    QString guige = ui->lineEdit_4->text();
    QString pinming = ui->lineEdit_5->text();
    QString xinghao = ui->lineEdit_6->text();
    QString xiushi = ui->lineEdit_7->text();
    QString yanse = ui->lineEdit_8->text();
    QString sql = "insert into priceinfo (caizhi,chandi,danjia,guige,pinming,xinghao,xiushi,yanse)values('"+caizhi+"','"+chandi+"','"+danjia+"','"+guige+"','"+pinming+"','"+xinghao+"','"+xiushi+"','"+yanse+"')";
    if(query->exec(sql)==true)
    {
     QMessageBox::about(this,"注册提示","记录添加成功");
     qmodel->setQuery("select * from priceinfo");
     ui->lineEdit->clear();
     ui->lineEdit_2->clear(); //清空文本框内容
     ui->lineEdit_3->clear(); //清空文本框内容
     ui->lineEdit_4->clear(); //清空文本框内容
     ui->lineEdit_5->clear(); //清空文本框内容
     ui->lineEdit_6->clear(); //清空文本框内容
     ui->lineEdit_7->clear(); //清空文本框内容
     ui->lineEdit_8->clear(); //清空文本框内容
     ui->lineEdit->setFocus(); //鼠标焦点移动到第一个文本框

    ui->tableView->scrollToBottom();

    }
    else
    {
        QMessageBox::about(this,"错误提示","记录添加失败");
            return;
    }




}

void Widget::on_pushButton_4_clicked()
{
    QString delsql ="delete  from priceinfo";
    query->exec(delsql);

    qmodel->setQuery("select * from priceinfo");
    ui->lineEdit->clear();
    ui->lineEdit_2->clear(); //清空文本框内容
    ui->lineEdit_3->clear(); //清空文本框内容
    ui->lineEdit_4->clear(); //清空文本框内容
    ui->lineEdit_5->clear(); //清空文本框内容
    ui->lineEdit_6->clear(); //清空文本框内容
    ui->lineEdit_7->clear(); //清空文本框内容
    ui->lineEdit_8->clear(); //清空文本框内容
    ui->lineEdit->setFocus();
    QMessageBox::information(this,"提示信息","已清空所有记录");
}

void Widget::on_update_clicked()
{
    QString caizhi = ui->lineEdit->text();
    QString chandi = ui->lineEdit_2->text();
    QString danjia = ui->lineEdit_3->text();
    QString guige = ui->lineEdit_4->text();
    QString pinming = ui->lineEdit_5->text();
    QString xinghao = ui->lineEdit_6->text();
    QString xiushi = ui->lineEdit_7->text();
    QString yanse = ui->lineEdit_8->text();

    QString delsql = "update priceinfo set caizhi= '"+caizhi+"',chandi='"+chandi+"',danjia='"+danjia+"',guige='"+guige+"',pinming = '"+pinming+"',xinghao='"+xinghao+"',xiushi='"+xiushi+"',yanse='"+yanse+"'  where pinming = '"+pinming+"'";
    query->exec(delsql);
    qmodel->setQuery("select * from priceinfo");
    ui->lineEdit->clear();
    ui->lineEdit_2->clear(); //清空文本框内容
    ui->lineEdit_3->clear(); //清空文本框内容
    ui->lineEdit_4->clear(); //清空文本框内容
    ui->lineEdit_5->clear(); //清空文本框内容
    ui->lineEdit_6->clear(); //清空文本框内容
    ui->lineEdit_7->clear(); //清空文本框内容
    ui->lineEdit_8->clear(); //清空文本框内容
    ui->lineEdit->setFocus();
    QMessageBox::information(this,"提示信息","已修改成功");
}

void Widget::on_tableView_clicked(const QModelIndex &index)
{
    QString caizhi1=index.siblingAtColumn(0).data().toString(); //获取点击行指定列的数据
    ui->lineEdit->setText(caizhi1); //将获取点击行指定列的数据赋予相应的文本输入框

    QString chandi1=index.siblingAtColumn(1).data().toString();
    ui->lineEdit_2->setText(chandi1);

    QString danjia1=index.siblingAtColumn(2).data().toString();
    ui->lineEdit_3->setText(danjia1);

    QString guige1=index.siblingAtColumn(3).data().toString();
    ui->lineEdit_4->setText(guige1);

    QString pinming1=index.siblingAtColumn(4).data().toString();
    ui->lineEdit_5->setText(pinming1);

    QString xinghao1=index.siblingAtColumn(5).data().toString();
    ui->lineEdit_6->setText(xinghao1);

    QString xiushi1=index.siblingAtColumn(6).data().toString();
    ui->lineEdit_7->setText(xiushi1);

    QString yanse1=index.siblingAtColumn(7).data().toString();
    ui->lineEdit_8->setText(yanse1);

}

void Widget::on_del_clicked()
{

   QString pinming2 = ui->lineEdit_5->text();

    QString delsql = "delete from priceinfo where pinming = '"+pinming2+"'";
    query->exec(delsql);
    qmodel->setQuery("select * from priceinfo");



}