作为自己的练习项目,项目内容可能并不符合业务逻辑,但是涉及到的QT知识运用比较全面。作为新手阶段性练手的项目。
本项目的主要功能实验在线购物,咨询客服,实时监控,销售记录,广告视频播放等功能。
Client.pro文件
QT += core gui sql
QT += multimedia
QT += multimediawidgets
QT += network
CONFIG += c++11
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Client
TEMPLATE = app
SOURCES += main.cpp \
userwidget.cpp \
consult.cpp
HEADERS += \
userwidget.h \
consult.h
FORMS += \
userwidget.ui \
consult.ui
OTHER_FILES +=
RESOURCES +=
userwidget.h
#ifndef WIDGET_H
#define WIDGET_H
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//数据库头文件
#include
#include
#include
#include
#include
#include
//consult类
#include "consult.h"
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void connectDB(); //连接数据库
void initData();
void setgoodslist();
private slots:
bool on_pushButton_register_clicked();
bool on_pushButton_login_clicked();
bool on_pushButton_quit_clicked();
void on_pushButton_search_clicked();
void on_comboBox_currentIndexChanged(const QString &arg1);
void on_comboBox_2_currentIndexChanged(const QString &arg1);
bool on_pushButton_addgoods_clicked();
void on_tabWidget_tabBarClicked();
bool on_pushButton_pay_clicked();
void on_pushButton_3_clicked();
void on_tableWidget_shoopCart_cellClicked(int row, int column);
void on_pushButton_consult_clicked();
private:
Ui::Widget *ui;
QCamera *camera;
QVideoWidget *showlabel;
//QTimer *mytimer;
QMediaPlayer *player;
QVideoWidget *videoWidget;
QMediaPlaylist *medialist;
QSqlTableModel *model;
consult *consult_subwidget;
int menu_high;//QTableWidget增加行
int cur_row;//购物车选中行
int cur_column;//购物车选中列
//tcp
QTcpSocket *clientSocket;
};
#endif // WIDGET_H
userwidget.cpp
#include "userwidget.h"
#include "ui_userwidget.h"
#include
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowTitle("客户端界面");
menu_high=0;
consult_subwidget=new consult;
///*******接收子窗口的信号********/
connect(consult_subwidget,&consult::mySignal,
[=]()
{
this->show();
consult_subwidget->hide();
}
);
/*********************摄像头调用*********************/
camera=new QCamera;
showlabel=new QVideoWidget(ui->label);
showlabel->resize(ui->label->size());
camera->setViewfinder(showlabel); //设置取景部件
// QCameraImageCapture *imageCapture;
//imageCapture =new QCameraImageCapture(camera);
//camera->setCaptureMode(QCamera::CaptureStillImage);//设置采集模式(采集为图片)
camera->start(); //开启摄像头
///
/*********************更新当前日期时间*******************************/
QTimer *mytimer=new QTimer;
mytimer->start(1000);
connect(mytimer,&QTimer::timeout,
[=]()
{
ui->label_time->setText(QTime::currentTime().toString());
ui->label_date->setText(QDate::currentDate().toString("yyyy年MM月dd号 "));
}
);
/*******************广告轮播视频************************/
player=new QMediaPlayer ;
videoWidget=new QVideoWidget(ui->label_ad);
medialist=new QMediaPlaylist;
// QVBoxLayout *layout = new QVBoxLayout; //用于指定视频播放的位置
videoWidget->resize(ui->label_ad->size());
// layout->addWidget(videoWidget);
// ui->label_ad->setLayout(layout);
player->setVideoOutput(videoWidget);//设置播放输出
medialist->addMedia(QUrl::fromLocalFile("E:\\360MoveData\\Users\\jill\\Desktop\\Client\\iphone11.mp4")); // \为转义字符,将视频放入容器
medialist->addMedia(QUrl::fromLocalFile("E:/360MoveData/Users/jill/Desktop/Client/mv.mp4"));
player->setPlaylist(medialist);//设置播放容器
medialist->setPlaybackMode(QMediaPlaylist::Loop);//设置播放模式
videoWidget->show();//窗体显示
player->play(); //播放
/****************更新商品类别*********************/
connectDB();//连接数据库
initData();//更新商品类别
ui->pushButton_addgoods->setEnabled(false);//登陆前加入购物车不可用
ui->pushButton_quit->setEnabled(false);//登陆前退出登录不可用
ui->pushButton_pay->setEnabled(false);//登陆前结算按钮不可用
}
Widget::~Widget()
{
delete camera;
delete showlabel;
//delete mytimer;
delete player;
delete videoWidget;
delete medialist;
delete consult_subwidget;
//delete querymodel;
}
/****************数据库连接***************/
void Widget::connectDB()
{
//添加数据库
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setUserName("root");
db.setPassword("4218");
db.setDatabaseName("mall");
//打开数据库
if(!db.open())
{
QMessageBox::warning(this, "数据库打开失败", db.lastError().text());
return;
}
}
/****************将数据库内容初始化到选择框***********/
void Widget::initData()
{
QSqlQueryModel *querymodel=new QSqlQueryModel(this);//新建模型
querymodel->setQuery("select item from category");
ui->comboBox->setModel(querymodel);//选择框设置sql模型
}
/*********会员注册登录退出**************/
bool Widget::on_pushButton_register_clicked()//注册
{
if(ui->lineEdit_name->text().isEmpty()||ui->lineEdit_password->text().isEmpty()||ui->lineEdit_name->text().isEmpty())
{
QMessageBox::information(this,"注册提示","请填写注册信息");
return false;
}
else
{
QString name= ui->lineEdit_name->text();
QString sex;
if (ui->radioButton_man->isChecked())
sex="男";
else if(ui->radioButton_girl->isChecked())
sex="女";
else
sex="null";
QString member_name=ui->lineEdit_account->text();
QString password=ui->lineEdit_password->text();
qDebug()<<name<<sex<<member_name<<password;
//插入数据库
QSqlQuery query;
QSqlDatabase::database().transaction(); // 记录插入前的状态
QString sql = QString("insert into register (name,sex,member_name,password) values ('%1','%2','%3','%4')").arg(name).arg(sex).arg(member_name).arg(password);
bool b1 = query.exec(sql);
if(b1){
QSqlDatabase::database().commit();
QMessageBox::information(this,"注册提示","注册成功!");
}
else
{
QSqlDatabase::database().rollback();
QMessageBox::information(this,"注册提示","注册未成功!");
}
//service->socket.write(temp.toUtf8());
}
ui->radioButton_girl->setChecked(false);
ui->radioButton_man->setChecked(false);
ui->lineEdit_name->clear();
ui->lineEdit_password->clear();
ui->lineEdit_name->clear();
return true;
}
bool Widget::on_pushButton_login_clicked()//登录
{
if(ui->lineEdit_password->text().isEmpty()||ui->lineEdit_account->text().isEmpty())
{
QMessageBox::warning(this,"登录提示","登录失败,需填完整的账号及密码");
return false;
}
else
{
QString account=ui->lineEdit_account->text();
QString pass_word = ui->lineEdit_password->text();
QString sex;
if(ui->radioButton_girl->isChecked())
sex="女";
else if(ui->radioButton_man->isChecked())
sex="男";
else
sex="null";
//对比数据库
QSqlQuery query;
QString sql = QString("select sex,member_name,password from register where sex='%1' and member_name='%2' and password='%3'")
.arg(sex).arg(account).arg(pass_word);
query.exec(sql);
if( query.next())//判断有无查询记录
{
//有记录
QMessageBox::information(this,"登录提示","登录成功!");
//登录成功后不准注册
ui->radioButton_girl->setChecked(false);
ui->radioButton_man->setChecked(false);
ui->lineEdit_account->clear();
ui->lineEdit_password->clear();
ui->lineEdit_name->clear();
ui->pushButton_addgoods->setEnabled(true);//打开加入购物车使能
ui->pushButton_quit->setEnabled(true);
}
else
{
//无记录
QMessageBox::information(this,"登录提示","不存在此用户,请重新登录!");
return false;
}
return true;
}
}
bool Widget::on_pushButton_quit_clicked()//退出
{
QMessageBox::information(this,"退出提示","退出成功");
ui->pushButton_addgoods->setEnabled(false);
ui->pushButton_quit->setEnabled(false);
return true;
}
/***************查找商品*****************/
void Widget::on_pushButton_search_clicked()
{
ui->textBrowser_searchGoods->clear();
QString tmp;
tmp=ui->lineEdit_searchgoods->text();
qDebug()<<tmp;
if(tmp.isEmpty())
{
QMessageBox::information(this,"查找商品","输入文本不能为空");
}
else
{
int flag=0;//商品查询标志
QSqlQuery query;
QString sql=QString("select goods,price,last from goods where goods like '%%1%'").arg(tmp);
if(query.exec(sql))
{
while(query.next())
{
QString goods=query.value(0).toString();
QString price=query.value(1).toString();
QString last =query.value(2).toString();
ui->textBrowser_searchGoods->append("商品名:"+goods+"\t价格:"+price+"\t剩余"+last+"\n");
flag=1;
ui->lineEdit_searchgoods->clear();
}
}
else
QMessageBox::warning(this, "查询失败", query.lastError().text());
if(flag==0)
{
QMessageBox::information(this,"查找商品","未找到相关商品");
}
ui->lineEdit_searchgoods->clear();
}
}
/**********商品类别改变槽信号***********/
void Widget::on_comboBox_currentIndexChanged(const QString &arg1)
{
ui->comboBox_2->clear();
ui->spinBox->setValue(1);
if(arg1=="请选择商品")
{
ui->pushButton_addgoods->setEnabled(false);
ui->lineEdit_price->clear();
ui->lineEdit_last->clear();
}
else
{
ui->comboBox_2->clear();
QSqlQuery query;
QString sql=QString("select goods,price,last from goods where item='%1'").arg(arg1);
//执行sql语句
query.exec(sql);
while(query.next())
{
QString goods= query.value(0).toString();
ui->comboBox_2->addItem(goods);
// QString price=query.value(1).toString();
// ui->lineEdit_price ->setText(price);
// QString last=query.value(2).toString();
// ui->lineEdit_last->setText(last);
}
}
}
/*************商品改变槽信号***********/
void Widget::on_comboBox_2_currentIndexChanged(const QString &arg1)
{
QSqlQuery query;
QString sql=QString("select price,last from goods where item='%1' and goods='%2'").
arg(ui->comboBox->currentText()).arg(arg1);
//执行sql语句
query.exec(sql);
while(query.next())
{
QString price=query.value(0).toString();
ui->lineEdit_price ->setText(price);
QString last=query.value(1).toString();
ui->lineEdit_last->setText(last);
}
}
/******************显示商品列表************************/
void Widget::setgoodslist()
{
model=new QSqlTableModel(this);//设置模型
model->setTable("goods");//指定表
ui->tableView_list->setModel(model);//把mode放到view
model->select();//显示model里的数据
//改表头
model->setHeaderData(0,Qt::Horizontal,"商品号");
model->setHeaderData(1,Qt::Horizontal,"类目");
model->setHeaderData(2,Qt::Horizontal,"商品");
model->setHeaderData(3,Qt::Horizontal,"价钱");
model->setHeaderData(4,Qt::Horizontal,"余量");
//设置view编辑触发条件 不设置可修改view
ui->tableView_list->setEditTriggers(QAbstractItemView::NoEditTriggers);
//model->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置提交策略(手动提交)
}
/*********加入购物车*********/
bool Widget::on_pushButton_addgoods_clicked()
{
//判断库存
int last=ui->lineEdit_last->text().toInt()-ui->spinBox->text().toInt();//加购物车后剩余
if(last<=0)
{
QMessageBox::information(ui->tableWidget_shoopCart,"添加商品提示","对不起库存不足");
return false;
}
//库存充足,购物车显示
QString item =ui->comboBox->currentText();
QString goods =ui->comboBox_2->currentText();
QString count =QString::number(ui->spinBox->value());//int->Qstring
QString single_goods_total = QString::number((ui->spinBox->value()*ui->lineEdit_price->text().toInt()));
//结算总价=第一次总价+后面的单价
ui->textBrowser_total->setText(QString::number(ui->textBrowser_total->toPlainText().toInt()+single_goods_total.toInt()));
//QTableWidget显示
ui->tableWidget_shoopCart->setRowCount(menu_high+1);
ui->tableWidget_shoopCart->setItem(menu_high,0,new QTableWidgetItem(goods));
ui->tableWidget_shoopCart->setItem(menu_high,1,new QTableWidgetItem(item));
ui->tableWidget_shoopCart->setItem(menu_high,2,new QTableWidgetItem(count));
ui->tableWidget_shoopCart->setItem(menu_high,3,new QTableWidgetItem(single_goods_total));
menu_high++;
ui->lineEdit_last->setText(QString::number(last));
ui->spinBox->setValue(1);
ui->pushButton_pay->setEnabled(true);
QMessageBox::information(ui->tableWidget_shoopCart,"添加商品提示","添加成功.可去购物菜单查看");
return true;
}
/*************商品列表显示*************/
void Widget::on_tabWidget_tabBarClicked()
{
setgoodslist();//显示商品列表
}
/************结算***************/
bool Widget::on_pushButton_pay_clicked()
{
//写交易记录文件
QFile file("./trading_record.txt");
bool fp=file.open(QIODevice::Append);
//1.更新数据库
//获取tableWidget_shoopCart的信息
int i=0;
for(i=0;i<ui->tableWidget_shoopCart->rowCount();i++)
{
QString goods_name=ui->tableWidget_shoopCart->item(i,0)->text();
QString items=ui->tableWidget_shoopCart->item(i,1)->text();
int number=ui->tableWidget_shoopCart->item(i,2)->text().toInt();
QString total=ui->tableWidget_shoopCart->item(i,3)->text();
//更新数据库
QSqlQuery query;
QSqlDatabase::database().transaction(); // 记录更新前的状态
QString sql = QString("update goods set last=last-'%1' where item='%2' and goods='%3'")
.arg(number)
.arg(items).arg(goods_name);
bool b1 = query.exec(sql);
if(b1){
QSqlDatabase::database().commit();
}
else
{
QSqlDatabase::database().rollback();
}
//3.写文件交易记录
if(fp)
{
QString str=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")+
"\t商品:"+goods_name+"\t所属类目:"+items+
"\t成交数量:"+QString::number(number)+"\t总计:"+total+"\n";
file.write(str.toLocal8Bit());
}
else
{
qDebug()<<"文件写入失败";
}
}
QMessageBox::information(this,"结算提示","结算成功");
file.write("*******************************\n");
//2.清空购物车
int row=ui->tableWidget_shoopCart->rowCount();
for (int var = 0; var < row; var++)
{
ui->tableWidget_shoopCart->removeRow(0);
}
menu_high=0;//购物车行数清零
//4.结算使能关闭
ui->pushButton_pay->setEnabled(false);
ui->textBrowser_total->clear();
return true;
}
/*****************购物车删除******************/
void Widget::on_pushButton_3_clicked()
{
//选中行大于购物车的总行数或则
if(cur_row > ui->tableWidget_shoopCart->currentRow()||ui->tableWidget_shoopCart->currentRow()<0||cur_row==-1)
{
QMessageBox::information(ui->tableWidget_shoopCart,"删除商品提示","删除失败");
}
else
{
//总加减去删除的商品数
ui->textBrowser_total->setText(QString::number(
(ui->textBrowser_total->toPlainText().toDouble()-ui->tableWidget_shoopCart->item(cur_row,3)->text().toDouble())));
ui->tableWidget_shoopCart->removeRow(cur_row);
menu_high--;
}
}
/********购物车选中槽函数cellClicked*********/
void Widget::on_tableWidget_shoopCart_cellClicked(int row, int column)
{
cur_row=row;
cur_column=column;
}
/*********在线咨询按钮**************/
void Widget::on_pushButton_consult_clicked()
{
consult_subwidget->TCP_Connect();
this->hide();
consult_subwidget->show();
}
consult.h
#ifndef CONSULT_H
#define CONSULT_H
#include
#include
#include
#include
namespace Ui {
class consult;
}
class consult : public QWidget
{
Q_OBJECT
public:
explicit consult(QWidget *parent = 0);
~consult();
private:
Ui::consult *ui;
public:
QTcpSocket *clientSocket;
void TCP_Connect();
protected:
void keyPressEvent(QKeyEvent *event);//键盘按下事件
private slots:
void on_pushButton_Return_clicked();
void on_pushButton_Send_clicked();
void on_pushButton_ClearInput_clicked();
void on_pushButton_ClearDisplay_clicked();
signals:
void mySignal();
};
#endif // CONSULT_H
consult.cpp
#include "consult.h"
#include "ui_consult.h"
consult::consult(QWidget *parent) :
QWidget(parent),
ui(new Ui::consult)
{
ui->setupUi(this);
clientSocket=NULL;
this->setWindowTitle("咨询客服界面");
TCP_Connect();
}
consult::~consult()
{
delete ui;
delete clientSocket;
}
void consult::TCP_Connect()
{
clientSocket=new QTcpSocket(this);
//获取服务端地址和端口,主动和服务器建立连接
clientSocket->connectToHost("127.0.0.1",10000);
connect(clientSocket,&QTcpSocket::connected, //连接
[=]()
{
ui->textBrowser->setText("客服:你好,请问你有什么帮助吗!");
connect(clientSocket,&QTcpSocket::readyRead, //等待接收
[=]()
{
QByteArray array=clientSocket->readAll(); //字节数组接收
ui->textBrowser->append("客服:"+array); //显示
}
);
}
);
}
void consult::on_pushButton_Return_clicked()
{
emit mySignal();//发信号
//返回主界面关闭socket连接
if(clientSocket==NULL)
{
return;
}
clientSocket->disconnectFromHost();
clientSocket->close();
}
void consult::on_pushButton_Send_clicked()
{
if(clientSocket==NULL)
{
return;
}
//获取编辑区内容
QString str=ui->textEdit->toPlainText();
if(str.isEmpty())//若编辑区为空返回
{
return;
}
//给对方发送数据
clientSocket->write(str.toUtf8().data());
QString tmp="我:"+str;
ui->textBrowser->append(tmp);
ui->textEdit->clear();
}
//enter按下事件
void consult::keyPressEvent(QKeyEvent *event)
{
if(event->key()==Qt::Key_Enter||event->key()==Qt::Key_Return)//Ctrl+Enter响应,可通过事件过滤器实现在textEdit按下enter发送
{
on_pushButton_Send_clicked();
}
// switch (event->key()) {
// case Qt::Key_Return:
// on_pushButton_Send_clicked();
// break;
// default:
// break;
// }
}
//输入框清空
void consult::on_pushButton_ClearInput_clicked()
{
ui->textEdit->clear();
}
//显示框清空
void consult::on_pushButton_ClearDisplay_clicked()
{
ui->textBrowser->clear();
}