系统采用C/S架构,主要分为客户端和服务端,数据库采用SQLite。
客户端主要分为用户登陆系统和管理员登陆系统:
1)用户系统实现用户的登陆注册,登陆完成后进入菜谱界面浏览菜谱(菜谱显示点击量),菜谱界面实现菜谱搜索、菜谱分类、菜谱推荐(根据点击量推荐)、菜谱收藏、菜谱评论、视频学习等功能,用户可以对自己的收藏进行浏览删除等操作,在菜谱下对自己评论进行评论和删除。
2)管理员系统实现管理员的登陆注册,登录完成后进入管理员界面。管理员模块实现对菜谱信息、用户信息和评论信息进行查询、修改、增加、删除等操作;管理员可以添加删除新的管理人员并对管理人员信息进行增删改查等操作。
服务端主要是后台管理系统,实现与客户端的通信连接,接受客户端数据写入数据库,实现数据的增删改查等操作。
源代码下载
菜谱视屏演示
账号数据库
菜谱数据库
评论数据表
网络客户端
登陆界面
本地后台管理界面
注册界面
开始界面
本地客户端
#ifndef CLIENT_H
#define CLIENT_H
#include <QWidget>
#include <QTcpSocket> //通信套接字
#include<QTableView>
#include<QSqlQueryModel>
#include<QSqlQuery>
#include<QModelIndex>
#include<QSqlTableModel>
#include<QTcpSocket>
#include"structor.h"
namespace Ui {
class Client;
}
class Client : public QWidget
{
Q_OBJECT
public:
explicit Client(QWidget *parent = nullptr);
~Client();
void menuPrint(QByteArray array);
private slots:
void on_buttonSend_clicked();
void on_buttonClose_clicked();
void on_buttonConnect_clicked();
void on_ButtonAdd_clicked();
void on_ButtonSubmit_clicked();
void on_ButtonDelete_clicked();
private:
Ui::Client *ui;
QTcpSocket *tcpSocket; //通信套接字
FoodInfo FoodTip;
std::vector<FoodInfo> FoodVect;
};
#endif // CLIENT_H
#ifndef CONNECT_H
#define CONNECT_H
#include <QSqlDatabase>
#include <QStringList>
#include <QString>
#include <QDebug>
#include <QSqlQuery>
#include <QMessageBox>
#include<QTcpServer>
#include<QTcpSocket>
static bool createConnection()
{
//?????????????qlite???????????????????sql????????
//2???????????????
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
//??????????????????????
// db.setHostName("localhost");//???????????????????????????????
// db.setDatabaseName("medical_system");//????????????
// db.setUserName("root");
// db.setPassword("123456");
//db.setPort(3306);//????????????????????????
db.setDatabaseName("cookmenu.db");
if(!db.open()){
//?????????????
qDebug()<<"Failed to connect";
//???????????????????????????????????????
QMessageBox::critical(0,"????????????? ","????????",QMessageBox::Yes);
return false;
}
QSqlQuery query(db);
// QString sql=QString("create table if not exist admin(username varchar(20) not null,password varchar(16) not null)");
// query.exec(sql);
query.exec("CREATE TABLE if not exist admin ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"username VARCHAR(40) NOT NULL, "
"password VARCHAR(40) NOT NULL)");
query.exec("insert into admin(id,username,password) values(1,'admin','admin')");
//query.finish();
return true;
}
#endif // CONNECT_H
#ifndef LOGIN_H
#define LOGIN_H
#include <QWidget>
#include"menu.h"
#include"register.h"
#include <QSqlDatabase>
#include<QTcpServer>
#include<QTcpSocket>
#include"tabvw.h"
#include <QSqlDatabase>
#include <QStringList>
#include <QString>
#include <QDebug>
#include <QSqlQuery>
#include <QMessageBox>
#include<QTcpServer>
namespace Ui {
class Login;
}
class Login : public QWidget
{
Q_OBJECT
public:
explicit Login(QWidget *parent = nullptr);
~Login();
private slots:
void on_ButtonLogin_clicked();
void on_ButtonRegister_clicked();
private:
Ui::Login *ui;
TabVw *custmMenu; //�˿ͽ���
QSqlDatabase db;
QSqlQuery query;
};
#endif // LOGIN_H
#ifndef MANAGER_H
#define MANAGER_H
#include <QMainWindow>
#include <QSqlDatabase>
#include <QStringList>
#include <QString>
#include <QDebug>
#include <QSqlQuery>
#include <QMessageBox>
#include<QSqlQueryModel>
#include<QSqlTableModel>
#include<QSqlRecord>
namespace Ui {
class Manager;
}
class Manager : public QWidget
{
Q_OBJECT
public:
explicit Manager(QWidget *parent = nullptr);
~Manager();
private slots:
void on_Button_Add_clicked();
void on_Button_Ok_clicked();
void on_Button_Del_clicked();
void on_Button_Cancel_clicked();
void on_pushButton_Find_clicked();
void on_Button_Add_2_clicked();
void on_Button_Del_2_clicked();
void on_Button_Ok_2_clicked();
void on_Button_Cancel_2_clicked();
void on_Button_Add_3_clicked();
void on_Button_Del_3_clicked();
void on_Button_Ok_3_clicked();
void on_Button_Cancel_3_clicked();
void on_Button_Find_7_clicked();
void on_pushButton_Find2_clicked();
private:
Ui::Manager *ui;
QSqlTableModel *m_model;
QSqlTableModel *model_use,*model_dis;
};
#endif // MANAGER_H
#ifndef REGISTER_H
#define REGISTER_H
#include <QSqlDatabase>
#include <QStringList>
#include <QString>
#include <QDebug>
#include <QSqlQuery>
#include <QMessageBox>
#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
namespace Ui {
class Register;
}
class Register : public QWidget
{
Q_OBJECT
public:
explicit Register(QWidget *parent = nullptr);
~Register();
private slots:
void on_pushButtonRegist_clicked();
private:
Ui::Register *ui;
QSqlDatabase db;
};
#endif // REGISTER_H
#ifndef SERVER_H
#define SERVER_H
#include <QWidget>
#include <QTcpServer> //监听套接字
#include <QTcpSocket> //通信套接字
#include<QTableView>
#include<QSqlQueryModel>
#include<QSqlQuery>
#include<QModelIndex>
#include<QSqlTableModel>
#include"structor.h"
#include<QVector>
#include<vector>
namespace Ui {
class Server;
}
class Server : public QWidget
{
Q_OBJECT
public:
explicit Server(QWidget *parent = nullptr);
~Server();
void Init(); //初始化
void TcpServer(); //服务端
void SelectDataBase();
private slots:
// void on_ButtonSend_clicked();
// void on_ButtonClose_clicked();
private:
Ui::Server *ui;
QTcpServer *tcpServer; //监听套接字
QTcpSocket *tcpSocket; //通信套接字
QSqlDatabase db;
FoodInfo FoodTip;
std::vector<FoodInfo> Foodset;
std::vector<FoodInfo> FoodVec;
};
#endif // SERVER_H
#ifndef STARTMENU_H
#define STARTMENU_H
#include <QMainWindow>
#include"login.h"
#include"menu.h"
#include"register.h"
#include<QTcpServer>
#include<QTcpSocket>
#include"tabvw.h"
namespace Ui {
class StartMenu;
}
class StartMenu : public QMainWindow
{
Q_OBJECT
public:
explicit StartMenu(QWidget *parent = nullptr);
~StartMenu();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::StartMenu *ui;
};
#endif // STARTMENU_H
#ifndef STRUCTOR_H
#define STRUCTOR_H
typedef struct Food
{
char number[10]; //id
char food[10]; //餐名
char type[10];
char price[10]; //价格
char hitnum[10]; //点击量
char method[10]; //做法
}FoodInfo;
#endif // STRUCTOR_H
#ifndef TABVW_H
#define TABVW_H
#include <QMainWindow>
#include<QSqlQueryModel>
#include<QSqlTableModel>
#include<QMessageBox>
#include <QMediaPlayer>
#include <QGraphicsVideoItem>
#include <QGraphicsView>
#include <QGraphicsScene>
#include"videoplayer.h"
class QMediaPlaylist;
namespace Ui {
class TabVw;
}
class TabVw : public QMainWindow
{
Q_OBJECT
public:
explicit TabVw(QWidget *parent = nullptr);
~TabVw();
private slots:
void on_tableView_clicked(const QModelIndex &index);
void upDatetime();//系统时间槽
void on_comboBox_activated(const QString &arg1);
void on_pushButton_clicked();//提交评论信息
// void on_pushButton_2_clicked();//显示评论信息
void on_pushButton_2_clicked();
void on_ButtonSocket_clicked();
void on_pushButton_play_clicked();
private:
Ui::TabVw *ui;
QSqlTableModel * qryModel;
QSqlDatabase db;
QTimer *ntimer;
// QSqlQuery query;
};
#endif // TABVW_H
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H
#include <QMediaPlayer>
#include <QWidget>
QT_BEGIN_NAMESPACE
class QAbstractButton;
class QSlider;
class QLabel;
class QUrl;
QT_END_NAMESPACE
class VideoPlayer : public QWidget
{
Q_OBJECT
public:
VideoPlayer(QWidget *parent = nullptr);
~VideoPlayer();
void setUrl(const QUrl &url);
public slots:
void openFile();
void play();
private slots:
void mediaStateChanged(QMediaPlayer::State state);
void positionChanged(qint64 position);
void durationChanged(qint64 duration);
void setPosition(int position);
void handleError();
private:
QMediaPlayer* m_mediaPlayer;
QAbstractButton *m_playButton;
QSlider *m_positionSlider;
QLabel *m_errorLabel;
};
#endif
#include "client.h"
#include "ui_client.h"
#include<QHostAddress>
#include<QHostAddress>
#include<QTableView>
#include<QSqlQueryModel>
#include<QSqlQuery>
#include<QModelIndex>
#include<QSqlTableModel>
Client::Client(QWidget *parent) :
QWidget(parent),
ui(new Ui::Client)
{
ui->setupUi(this);
tcpSocket=NULL;
QByteArray array;
tcpSocket=new QTcpSocket(this);
setWindowTitle(QString::fromLocal8Bit("Client"));
connect(tcpSocket,&QTcpSocket::connected,
[=]{
// ui->textEditRead->setText(QString::fromLocal8Bit("成功和服务器建立连接"));
});
connect(tcpSocket,&QTcpSocket::readyRead,
[=]{
QByteArray array=tcpSocket->readAll();
//ui->textEditRead->append(array);
qDebug()<<array;
menuPrint(array);
});
}
Client::~Client()
{
delete ui;
}
void Client::on_buttonSend_clicked()
{
//获取编辑框内容
// QString str = ui->textEditWrite->toPlainText();
//发送数据
// tcpSocket->write( str.toUtf8().data() );
}
void Client::on_buttonClose_clicked()
{
//主动和对方断开连接
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
void Client::on_buttonConnect_clicked()
{
//获取服务器ip和端口
QString ip = ui->lineEditIP->text();
qint16 port = ui->lineEditPort->text().toInt();
//主动和服务器建立连接
tcpSocket->connectToHost(QHostAddress(ip), port);
}
void Client::menuPrint(QByteArray array) //菜谱打印
{
FoodVect.clear();
FoodVect.resize(array.size()/sizeof(FoodInfo));
memcpy(FoodVect.data(),array.data(),array.size());
QStringList headtext;
headtext<<"ID"<<"name"<<"type"<<"price"<<"hitnum"<<"method";
ui->tableWidget->setColumnCount(headtext.count());//列表设置为和headtext相等
ui->tableWidget->setHorizontalHeaderLabels(headtext);//插入表头
ui->tableWidget->setRowCount(0);
int rowcount;
qDebug()<< FoodVect.size();
for (int j=0;j< FoodVect.size();j++)
{
qDebug()<<FoodVect[j].food;
rowcount = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(rowcount);
QTableWidgetItem *column = new QTableWidgetItem(FoodVect[j].number);
QTableWidgetItem *column1 = new QTableWidgetItem(FoodVect[j].food);
QTableWidgetItem *column2 = new QTableWidgetItem(FoodVect[j].type);
QTableWidgetItem *column3 = new QTableWidgetItem(FoodVect[j].price);
QTableWidgetItem *column4 = new QTableWidgetItem(FoodVect[j].hitnum);
QTableWidgetItem *column5 = new QTableWidgetItem(FoodVect[j].method);
ui->tableWidget->setItem(rowcount,0,column);
ui->tableWidget->setItem(rowcount,1,column1);
ui->tableWidget->setItem(rowcount,2,column2);
ui->tableWidget->setItem(rowcount,3,column3);
ui->tableWidget->setItem(rowcount,4,column4);
ui->tableWidget->setItem(rowcount,5,column5);
}
}
void Client::on_ButtonAdd_clicked()
{
int rowcount=ui->tableWidget->rowCount();
ui->tableWidget->insertRow(rowcount);
}
void Client::on_ButtonSubmit_clicked()
{
FoodInfo fooditem;
int row=ui->tableWidget->currentRow();
QString id=ui->tableWidget->item(row,0)->text();
QString name=ui->tableWidget->item(row,1)->text();
QString type=ui->tableWidget->item(row,2)->text();
QString price=ui->tableWidget->item(row,3)->text();
QString hitnum=ui->tableWidget->item(row,4)->text();
QString met=ui->tableWidget->item(row,5)->text();
QString sqsstr=QString( "insert into cook VALUES('"+id+"','"+name+"','"+type+"','"+price+"','"+hitnum+"','"+met+"')");
// QByteArray ba=id.toLocal8Bit();
// memcpy(fooditem.number,ba.data(),ba.size()+1);
// ba=name.toLocal8Bit();
// memcpy(fooditem.food,ba.data(),ba.size()+1);
// ba=type.toLocal8Bit();
// memcpy(fooditem.type,ba.data(),ba.size()+1);
// ba=price.toLocal8Bit();
// memcpy(fooditem.price,ba.data(),ba.size()+1);
// ba=hitnum.toLocal8Bit();
// memcpy(fooditem.hitnum,ba.data(),ba.size()+1);
// ba=met.toLocal8Bit();
// memcpy(fooditem.method,ba.data(),ba.size()+1);
// QByteArray foodArray;
// foodArray.append((char *)&fooditem,sizeof(fooditem));
foodArray.resize(sizeof(fooditem));
FoodVect.clear();
FoodVect.push_back(fooditem);
memcpy(foodArray.data(),FoodVect.data(),sizeof(fooditem)*FoodVect.size());
tcpSocket->write(sqsstr.toLocal8Bit());
}
void Client::on_ButtonDelete_clicked()
{
FoodInfo fooditem;
int row=ui->tableWidget->currentRow();
QString id=ui->tableWidget->item(row,0)->text();
if(row!=0)
{
ui->tableWidget->removeRow(row);
if(id=="")
return ;
QByteArray ba=id.toLocal8Bit();
memcpy(fooditem.number,ba.data(),ba.size()+1);
QString str=QString("delete from cook where id='"+ba+"'");
tcpSocket->write(str.toLocal8Bit());
}
}
void Client::on_ButtonRefresh_clicked()
{
QString str="Refresh";
tcpSocket->write(str.toLocal8Bit());
ui->tableWidget->clear();
connect(tcpSocket,&QTcpSocket::readyRead,
[=]{
qDebug()<<"refresh table widget";
QByteArray array=tcpSocket->readAll();
//ui->textEditRead->append(array);
qDebug()<<array;
menuPrint(array);
});
}
void Client::on_ButtonModify_clicked()
{
}
void Client::on_ButtonFind_clicked()
{
QString str=ui->lineEditFind->text();
QString str1=ui->comboBoxType->currentText();
QString sql=QString("select * from cook where str=='+str1+'");
tcpSocket->write(sql.toLocal8Bit());
}
#include "login.h"
#include "ui_login.h"
#include "register.h"
#include "mainwindow.h"
#include <QMessageBox>
#include <QSqlQuery>
#include <QFile>
#include <QDebug>
#include"tabvw.h"
Login::Login(QWidget *parent) :
QWidget(parent),
ui(new Ui::Login)
{
ui->setupUi(this);
ui->lineEditPass->setEchoMode(QLineEdit::Password);
if(QSqlDatabase::contains("qt_sql_default_connection"))//默认的连接名是否存在
db = QSqlDatabase::database("qt_sql_default_connection");
else //默认连接名不存在,头次连接
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cookmenu.db");
//QSqlQuery query(db);
query.exec("CREATE TABLE if not exits admin ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"username VARCHAR(40) NOT NULL, "
"password VARCHAR(40) NOT NULL)");
query.exec("insert into admin(id,username,password) values(4,'admin1','admin')");
}
Login::~Login()
{
delete ui;
}
void Login::on_ButtonLogin_clicked()
{
if(QSqlDatabase::contains("qt_sql_default_connection"))//默认的连接名是否存在
db = QSqlDatabase::database("qt_sql_default_connection");
else //默认连接名不存在,头次连接
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cookmenu.db");
QString username = ui->lineEditUser->text();
QString password = ui->lineEditPass->text();
if(username == "" ||password == ""){
QMessageBox::information(this,"警告","输入不能为空",QMessageBox::Ok);
}
else
{
QSqlQuery query(db);
query.prepare("select username,password from admin where username=:username and password = :password ");
query.bindValue(":username", username);
query.bindValue(":password", password);
query.exec();
if(!query.next())
{
//结果集为空
//执行某操作
QMessageBox::information(this,"警告 ","用户名或密码错误! ",QMessageBox::Ok);
}
else
{
QMessageBox::information(this,"提醒 ","登录成功! ",QMessageBox::Ok);
custmMenu = new TabVw();
custmMenu->show(); //显示顾客界面
// TabVw tab;
// tab.show();
this->hide();
}
}
}
void Login::on_ButtonRegister_clicked()
{
Register *r = new Register;
r->show();
//this->hide();
}
#include "mainwindow.h"
//#include"login.h"
#include"connect.h"
#include <QApplication>
#include"startmenu.h"
#include"tabvw.h"
#include"client.h"
#include"server.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// MainWindow w;
// w.show();
createConnection();
StartMenu Smenu;
Smenu.show();
// Server sev;
// sev.show();
// Client clt;
// clt.show();
// TabVw menu;
// menu.show();
return a.exec();
}
#include "manager.h"
#include "ui_manager.h"
Manager::Manager(QWidget *parent) :
QWidget(parent),
ui(new Ui::Manager)
{
ui->setupUi(this);
this->setWindowTitle("管理员管理界面 ");
ui->tableView->verticalHeader()->setHidden(true);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
//ui->tableView->setSelectionModel(QAbstractItemView::SingleSelection);
ui->tableView->setAlternatingRowColors(true);
this->resize(1000,600);
QSqlDatabase db;
if(QSqlDatabase::contains("qt_sql_default_connection"))//默认的连接名是否存在
db = QSqlDatabase::database("qt_sql_default_connection");
else //默认连接名不存在,头次连接
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cookmenu.db");
if(!db.open()){
//打开失败的情况
qDebug()<<"Failed to connect";
//实际情况下我们应该使用图形化窗口提示打开失败
QMessageBox::critical(this,"无法打开数据库 ","无法创建 ",QMessageBox::Yes);
// return false;
}
m_model=new QSqlTableModel(this);
m_model->setTable("cook");
//m_model->setQuery("select *from students");
model_use=new QSqlTableModel(this);
model_dis=new QSqlTableModel(this);
model_use->setTable("admin");
model_dis->setTable("Discuss");
//ui->tableView->setItemDelegateForColumn(2,)
ui->tableView->setModel(m_model);
ui->tableView_2->setModel(model_use);
ui->tableView_3->setModel(model_dis);
// ui->tableView->horizontalHeader()->sectionResizeMode(QHeaderView::ResizeToContents);
// ui->tableView_2->horizontalHeader()->sectionResizeMode(QHeaderView::ResizeToContents);
// ui->tableView_3->horizontalHeader()->sectionResizeMode(QHeaderView::ResizeToContents);
m_model->select();
model_dis->select();
model_use->select();
m_model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model_dis->setEditStrategy(QSqlTableModel::OnManualSubmit);
model_use->setEditStrategy(QSqlTableModel::OnManualSubmit);
// ui->tableView->setEditTriggers()
}
Manager::~Manager()
{
delete ui;
}
void Manager::on_Button_Add_clicked()
{
QSqlRecord record=m_model->record();
int row=m_model->rowCount();
m_model->insertRecord(row,record);
}
void Manager::on_Button_Ok_clicked()
{
m_model->submitAll();
}
void Manager::on_Button_Del_clicked()
{
QItemSelectionModel *sModel=ui->tableView->selectionModel();
QModelIndexList list=sModel->selectedRows();
for(int i=0;i<list.size();i++)
{
m_model->removeRow(list.at(i).row());
}
}
void Manager::on_Button_Cancel_clicked()
{
m_model->revertAll();
m_model->submitAll();
}
void Manager::on_pushButton_Find_clicked()
{
QString name=ui->lineEdit->text();
QString str=QString("name='%1'").arg(name);
m_model->setFilter(str);
m_model->select();
}
//用户信息数据库管理
void Manager::on_Button_Add_2_clicked()
{
QSqlRecord record=model_use->record();
int row=model_use->rowCount();
model_use->insertRecord(row,record);
}
//用户信息数据库数据删除
void Manager::on_Button_Del_2_clicked()
{
QItemSelectionModel *sModel=ui->tableView_2->selectionModel();
QModelIndexList list=sModel->selectedRows();
for(int i=0;i<list.size();i++)
{
model_use->removeRow(list.at(i).row());
}
}
//用户信息数据库确认
void Manager::on_Button_Ok_2_clicked()
{
model_use->submitAll();
}
void Manager::on_Button_Cancel_2_clicked()
{
model_use->revertAll();
model_use->submitAll();
}
//用户信息数据库查找
void Manager::on_pushButton_Find2_clicked()
{
QString name=ui->lineEdit_2->text();
QString str=QString("username='%1'").arg(name);
model_use->setFilter(str);
model_use->select();
}
//评论数据库管理
void Manager::on_Button_Add_3_clicked()
{
QSqlRecord record=model_dis->record();
int row=model_dis->rowCount();
model_dis->insertRecord(row,record);
}
void Manager::on_Button_Del_3_clicked()
{
QItemSelectionModel *sModel=ui->tableView_3->selectionModel();
QModelIndexList list=sModel->selectedRows();
for(int i=0;i<list.size();i++)
{
model_dis->removeRow(list.at(i).row());
}
}
void Manager::on_Button_Ok_3_clicked()
{
model_dis->submitAll();
}
void Manager::on_Button_Cancel_3_clicked()
{
model_dis->revertAll();
model_dis->submitAll();
}
void Manager::on_Button_Find_7_clicked()
{
QString name=ui->lineEdit_3->text();
QString str=QString("name='%1'").arg(name);
model_dis->setFilter(str);
model_dis->select();
}
在这里插入代码片
#include "register.h"
#include "ui_register.h"
#include <QMessageBox>
#include<QSqlQueryModel>
Register::Register(QWidget *parent) :
QWidget(parent),
ui(new Ui::Register)
{
ui->setupUi(this);
}
Register::~Register()
{
delete ui;
}
void Register::on_pushButtonRegist_clicked()
{
if(QSqlDatabase::contains("qt_sql_default_connection"))//默认的连接名是否存在
db = QSqlDatabase::database("qt_sql_default_connection");
else //默认连接名不存在,头次连接
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cookmenu.db");
if(!db.open()){
qDebug()<<"Failed to connect";
QMessageBox::critical(this,"database ","database open failure",QMessageBox::Yes);
}
QSqlQuery query;
query.exec("SELECT * FROM admin");
QSqlQueryModel *queryModel = new QSqlQueryModel();
queryModel->setQuery(query);
int nRecordCount = queryModel->rowCount();
QString username = ui->lineEditUser->text();
QString password = ui->lineEditPass->text();
query.exec("insert into admin(id,username,password) values('nRecordCount','"+username+"','"+password+"')");
if(username == "" ||password == "")
{
QMessageBox::information(this,"警告","输入不能为空",QMessageBox::Ok);
}
else
{
query.exec("select username from admin where username='"+username+"'");
// query.bindValue(":username", username);
// query.execBatch();
if(query.next())
{
QMessageBox::information(this,"警告 ","用户名已存在! ",QMessageBox::Ok);
}
else
{
// query.prepare("insert into admin(username,password)"
// "values(:username,:password)");
// query.bindValue(":username", username);
// query.bindValue(":password",password);
// query.exec("insert into admin(id,username,password) values(4,'admin1','admin')");
if(!query.exec("insert into admin (id,username,password)values(NULL,'"+username+"','"+password+"')"))
{
QMessageBox::information(this,"警告 ","注册成功! ",QMessageBox::Ok);
}
//query.execBatch();
}
}
}
#include "server.h"
#include "ui_server.h"
#include<QMessageBox>
#include<windows.h>
#include"structor.h"
#include <QSqlError>
Server::Server(QWidget *parent) :
QWidget(parent),
ui(new Ui::Server)
{
ui->setupUi(this);
if(QSqlDatabase::contains("qt_sql_default_connection"))//默认的连接名是否存在
db = QSqlDatabase::database("qt_sql_default_connection");
else //默认连接名不存在,头次连接
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cookmenu.db");
if(!db.open()){
//?????????????
qDebug()<<"Failed to connect";
//???????????????????????????????????????
QMessageBox::critical(0,"????????????? ","????????",QMessageBox::Yes);
}
QSqlQuery query;
// //query.exec("select * from sqlite_master where type='table';")
// QString str=QString("select * from sqlite_master where type='table'");
// query.exec(str);
// while(query.next())
// {
// qDebug()<<query.value(0).toString();
// }
// QStringList tables=db.tables();
// qDebug() << QString::fromLocal8Bit("表的个数: %1").arg(tables.count()); //打印表的个数
// QStringListIterator itr(tables);
// while(itr.hasNext())
// {
// QString tableName=itr.next().toLocal8Bit();
// qDebug()<<tableName;
// }
query.exec("select * from cook;");
while(query.next())
{
QString str=query.value("id").toString();
QString str1=query.value("name").toString();
QString str2=query.value("type").toString();
QString str3=query.value("price").toString();
QString str4=query.value("hitnum").toString();
QString str5=query.value("method").toString();
// char Id[10];
// char Food[10];
// char Type[10];
// char Price[10];
// char Hit[20];
// char Methr[10];
QByteArray ba=str.toLocal8Bit();
memcpy(FoodTip.number,ba.data(),ba.size()+1);
ba=str1.toLocal8Bit();
memcpy(FoodTip.food,ba.data(),ba.size()+1);
ba=str2.toLocal8Bit();
memcpy(FoodTip.type,ba.data(),ba.size()+1);
ba=str3.toLocal8Bit();
memcpy(FoodTip.price,ba.data(),ba.size()+1);
ba=str4.toLocal8Bit();
memcpy(FoodTip.hitnum,ba.data(),ba.size()+1);
ba=str5.toLocal8Bit();
memcpy(FoodTip.method,ba.data(),ba.size()+1);
// strcpy(FoodTip.number,Id);
// strcpy(FoodTip.food,Food);
// strcpy(FoodTip.type,Type);
// strcpy(FoodTip.price,Price);
// strcpy(FoodTip.hitnum,Hit);
// strcpy(FoodTip.method,Methr);
FoodVec.push_back(FoodTip);//菜谱信息放入容器中
}
QByteArray btyarray;
btyarray.resize(sizeof(FoodTip)*FoodVec.size());
memcpy(btyarray.data(),FoodVec.data(),sizeof(FoodTip)*FoodVec.size());
tcpServer = NULL;
tcpSocket = NULL;
tcpServer=new QTcpServer(this);
tcpServer->listen(QHostAddress::Any,8888);
setWindowTitle(QString::fromUtf8("服务器:8888"));
connect(tcpServer,&QTcpServer::newConnection,
[=]{
//取出建立好连接的套接字
tcpSocket=tcpServer->nextPendingConnection();
//获取对方的IP和端口
QString ip=tcpSocket->peerAddress().toString();
qint16 port=tcpSocket->peerPort();
QString temp = QString("[%1:%2]:sucessfull connected!").arg(ip).arg(port);
// ui->textEditRead->setText(temp);
connect(tcpSocket,&QTcpSocket::readyRead,
[=]{
QSqlQuery query;
QByteArray array=tcpSocket->readAll();
// if(strcmp(array.data(),"Refresh"))
// qDebug()<<"121212";
//执行客户端传入的SQL语句
if(!query.exec(array))
{
qDebug()<<"strrr failer"<<query.lastError();
}
});
tcpSocket->write(btyarray);
});
connect(tcpSocket,&QTcpSocket::readyRead,
[=]{
QByteArray array=tcpSocket->readAll();
QSqlQuery query;
if(!strcmp(array.data(),"Refresh"))
{
qDebug()<<"12123";
SelectDataBase();
}
});
// while(itr.hasNext())
// {
// tcpSocket->write( itr.next().toLocal8Bit());
// }
//测试数据库插入功能函数
// if(!query.exec("insert into cook VALUES(10,'asdq','asa','qqq','qwqwq','qqq')"))
// {
// qDebug()<<"failer"<<query.lastError();
// }
// else
// qDebug()<<"sucessfull";
}
Server::~Server()
{
delete ui;
}
//void Server::on_ButtonSend_clicked()
//{
// if(NULL == tcpSocket)
// {
// return;
// }
// QStringList tables=db.tables();
// // qDebug() << QString::fromLocal8Bit("表的个数: %1").arg(tables.count()); //打印表的个数
QStringListIterator itr(tables);
while(itr.hasNext())
{
tcpSocket->write( itr.next().toLocal8Bit()+"\r\n");
Sleep(5);
}
// //获取编辑区内容
// //QString str = ui->textEditWrite->toPlainText();
// //给对方发送数据, 使用套接字是tcpSocket
// //tcpSocket->write( str.toUtf8().data() );
//}
//void Server::on_ButtonClose_clicked()
//{
// if(NULL == tcpSocket)
// {
// return;
// }
// //主动和客户端端口连接
// tcpSocket->disconnectFromHost();
// tcpSocket->close();
// tcpSocket = NULL;
//}
void Server::SelectDataBase()
{
QSqlQuery query;
query.exec("select * from cook;");
while(query.next())
{
QString str=query.value("id").toString();
QString str1=query.value("name").toString();
QString str2=query.value("type").toString();
QString str3=query.value("price").toString();
QString str4=query.value("hitnum").toString();
QString str5=query.value("method").toString();
QByteArray ba=str.toLocal8Bit();
memcpy(FoodTip.number,ba.data(),ba.size()+1);
ba=str1.toLocal8Bit();
memcpy(FoodTip.food,ba.data(),ba.size()+1);
ba=str2.toLocal8Bit();
memcpy(FoodTip.type,ba.data(),ba.size()+1);
ba=str3.toLocal8Bit();
memcpy(FoodTip.price,ba.data(),ba.size()+1);
ba=str4.toLocal8Bit();
memcpy(FoodTip.hitnum,ba.data(),ba.size()+1);
ba=str5.toLocal8Bit();
memcpy(FoodTip.method,ba.data(),ba.size()+1);
// strcpy(FoodTip.number,Id);
// strcpy(FoodTip.food,Food);
// strcpy(FoodTip.type,Type);
// strcpy(FoodTip.price,Price);
// strcpy(FoodTip.hitnum,Hit);
// strcpy(FoodTip.method,Methr);
FoodVec.push_back(FoodTip);//菜谱信息放入容器中
}
QByteArray btyarray;
btyarray.resize(sizeof(FoodTip)*FoodVec.size());
memcpy(btyarray.data(),FoodVec.data(),sizeof(FoodTip)*FoodVec.size());
tcpSocket->write(btyarray);
}
#include "startmenu.h"
#include "ui_startmenu.h"
#include"manager.h"
StartMenu::StartMenu(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::StartMenu)
{
ui->setupUi(this);
}
StartMenu::~StartMenu()
{
delete ui;
}
void StartMenu::on_pushButton_clicked()
{
this->hide();
Login *loginer=new Login;
loginer->show();
}
void StartMenu::on_pushButton_2_clicked()
{
Manager *Managergui=new Manager;
Managergui->show();
//this->hide();
}
#include "tabvw.h"
#include "ui_tabvw.h"
#include"mainwindow.h"
#include"videoplayer.h"
#include <QDataWidgetMapper>
#include<QSqlRecord>
#include<QDateTime>
#include<QTimer>
#include<QMessageBox>
#include<QSqlQuery>
#include"client.h"
#include"server.h"
#include <QMediaPlayer>
#include <QGraphicsVideoItem>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QtWidgets/QApplication>
#include <QtWidgets/QDesktopWidget>
#include <QtCore/QCommandLineParser>
#include <QtCore/QCommandLineOption>
#include <QtCore/QDir>
#include <QtWidgets>
#include <QVideoWidget>
TabVw::TabVw(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::TabVw)
{
ui->setupUi(this);
//QSqlTableModel *qryModel; // �版�ā��
// QItemSelectionModel *theSelection; // ���╂ā��
// QDataWidgetMapper *dataMapper; // �版����㈡��灏�
QDateTime current_date_time=QDateTime::currentDateTime();
ui->dateTimeEdit->setDateTime(current_date_time);
ntimer= new QTimer(this);//绯荤��堕�村��跺��
connect(this->ntimer,SIGNAL(timeout()),this,SLOT(upDatetime()));
this->ntimer->start(1000);//姣���1s瑙﹀��涓�娆�
//娣诲���版��椹卞��
if(QSqlDatabase::contains("qt_sql_default_connection"))//榛�璁ょ��杩��ュ����﹀���
db = QSqlDatabase::database("qt_sql_default_connection");
else //榛�璁よ��ュ��涓�瀛���澶存杩���
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cookmenu.db");
if(!db.open()){
//��寮�澶辫触������
qDebug()<<"Failed to connect";
//瀹������典���浠�璇ヤ娇�ㄥ�惧舰��绐��f��绀烘��寮�澶辫触
QMessageBox::critical(this,"��娉���寮��版�� ","��娉���寤�",QMessageBox::Yes);
// return false;
}
qryModel=new QSqlTableModel(this);
qryModel->setTable("cook");
QSqlQuery query1("cookmenu.db");
query1.exec("select DIStinct type from cook");
QSqlRecord rec=query1.record();
ui->comboBox->addItem("�ㄩ��");
while(query1.next())
{
QString items=query1.value(0).toString();
ui->comboBox->addItem(items);
}
QString selectitems;
if(ui->comboBox->currentText()=="�ㄩ��")
{
qryModel->select();
ui->tableView->setModel(qryModel);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setMinimumSectionSize(100);
// ui->tableView->verticalHeader()->setMinimumSectionSize(50);
}
// connect(theSelection,SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),this,SLOT(on_currentRowChanged(QModelIndex,QModelIndex)));
}
TabVw::~TabVw()
{
delete ui;
}
void TabVw::on_tableView_clicked(const QModelIndex &index)
{
QSqlRecord record=qryModel->record(index.row());
QString id=record.value("id").toString();
QString namestr=record.value("name").toString();
QString pri=record.value("price").toString();
//�剧ず�稿������inetext�т欢
ui->lineEdit_id->setText(id);
ui->lineEdit_name->setText(namestr);
ui->lineEdit_type->setText(pri);
}
void TabVw::on_comboBox_activated(const QString &arg1)
{
qryModel=new QSqlTableModel(this);
qryModel->setTable("cook");
if(arg1=="�ㄩ��")
{
qryModel->select();
ui->tableView->setModel(qryModel);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setMinimumSectionSize(100);
//ui->tableView->verticalHeader()->setMinimumSectionSize(100);
}else
{
qryModel->setFilter("type='"+arg1+"'");
qryModel->select();
ui->tableView->setModel(qryModel);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setMinimumSectionSize(100);
// ui->tableView->verticalHeader()->setMinimumSectionSize(100);
}
}
//绯荤��堕�存Ы
void TabVw::upDatetime()
{
QDateTime timeNow = QDateTime::currentDateTime();//褰����堕��
QString str = timeNow.toString("yyyy-MM-dd hh:mm:ss");//褰����堕�存�煎�
this->ui->lcdNumber->display(str);
}
void TabVw::on_pushButton_clicked()
{
if(ui->lineEditDiss->text().isEmpty())//濡���璇�璁轰俊�负绌猴���杩���锛�涓����ユ�版��
return ;
// db=QSqlDatabase::addDatabase("QSQLITE");
// db.setDatabaseName("cookmenu.db");
// if(!db.open()){
// //��寮�澶辫触������
// qDebug()<<"Failed to connect";
// //瀹������典���浠�璇ヤ娇�ㄥ�惧舰��绐��f��绀烘��寮�澶辫触
// QMessageBox::critical(this,"��娉���寮��版�� ","��娉���寤�",QMessageBox::Yes);
// // return false;
// }
QSqlTableModel query;
query.setTable("discuss");
int id=ui->lineEdit_id->text().toInt();
QString topic_name=ui->lineEdit_name->text();
QString diss=ui->lineEditDiss->text();
//�峰��绯荤��堕��
QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QSqlRecord record=query.record();
query.select();
int rowNum=query.rowCount();
record.setValue("ID", rowNum);
record.setValue("topic_id", id);
record.setValue("topic_name", topic_name);
record.setValue("content", diss);
record.setValue("datetime",time);
query.insertRecord(rowNum, record);
ui->lineEditDiss->clear();
// query.exec("insert into discuss(ID,topic_id,topic_name,content,datetime)values('1','id','topic_name','diss')");
//query.exec("insert into discuss(ID,topic_id,topic_name,content)values('1','21','asada','adsdfsfsdfdsfdsfdsfdsfsgfs')");
}
//void TabVw::on_pushButton_2_clicked()
//{
// QSqlQuery query;
// query.exec("select * from disscus");
// while(query.next())
// {
// QString str=QString("id is %1 topic_id is %2 foodname is %3 discuss is %4 dateTime is %5")
// .arg(query.value(0).toString(),query.value(1).toString()
// ,query.value(2).toString(),query.value(3).toString());
// ui->textEdit->setText(str);
// }
//}
void TabVw::on_pushButton_2_clicked()
{
ui->textEdit->clear();
if(QSqlDatabase::contains("qt_sql_default_connection"))//榛�璁ょ��杩��ュ����﹀���
db = QSqlDatabase::database("qt_sql_default_connection");
else //榛�璁よ��ュ��涓�瀛���澶存杩���
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cookmenu.db");
QSqlQuery query(db);
query.exec("select * from discuss");
while(query.next())
{
qDebug()<<"222222222222";
qDebug()<<query.value(0).toInt();
qDebug()<<query.value(1).toString();
qDebug()<<query.value(2).toString();
QString str=QString("id is %1 topic_id is %2 foodname is %3 discuss is %4 dateTime is %5")
.arg(query.value(0).toString(),query.value(1).toString()
,query.value(2).toString(),query.value(3).toString(),query.value(4).toString());
ui->textEdit->append(str);
ui->textEdit->append("\r");
}
// ui->textEdit->append("11111111111111111111");
}
void TabVw::on_ButtonSocket_clicked()
{
Server *serv=new Server();
serv->hide();
Client *clent=new Client();
clent->show();
this->hide();
}
void TabVw::on_pushButton_play_clicked()
{
VideoPlayer *player;
player=new (VideoPlayer);
// if (!parser.positionalArguments().isEmpty()) {
// const QUrl url =
// QUrl::fromUserInput(parser.positionalArguments().constFirst(),
QDir::currentPath(), QUrl::AssumeLocalFile);
// player.setUrl(url);
// }
const QRect availableGeometry = QApplication::desktop()->availableGeometry(player);
player->resize(availableGeometry.width() / 6, availableGeometry.height() / 4);
player->show();
}
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "videoplayer.h"
#include <QtWidgets/QApplication>
#include <QtWidgets/QDesktopWidget>
#include <QtCore/QCommandLineParser>
#include <QtCore/QCommandLineOption>
#include <QtCore/QDir>
#include <QtWidgets>
#include <QVideoWidget>
VideoPlayer::VideoPlayer(QWidget *parent)
: QWidget(parent)
{
m_mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
QVideoWidget *videoWidget = new QVideoWidget;
QAbstractButton *openButton = new QPushButton(tr("Open..."));
connect(openButton, &QAbstractButton::clicked, this, &VideoPlayer::openFile);
m_playButton = new QPushButton;
m_playButton->setEnabled(false);
m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
connect(m_playButton, &QAbstractButton::clicked,
this, &VideoPlayer::play);
m_positionSlider = new QSlider(Qt::Horizontal);
m_positionSlider->setRange(0, 0);
connect(m_positionSlider, &QAbstractSlider::sliderMoved,
this, &VideoPlayer::setPosition);
m_errorLabel = new QLabel;
m_errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
QBoxLayout *controlLayout = new QHBoxLayout;
controlLayout->setMargin(0);
controlLayout->addWidget(openButton);
controlLayout->addWidget(m_playButton);
controlLayout->addWidget(m_positionSlider);
QBoxLayout *layout = new QVBoxLayout;
layout->addWidget(videoWidget);
layout->addLayout(controlLayout);
layout->addWidget(m_errorLabel);
setLayout(layout);
m_mediaPlayer->setVideoOutput(videoWidget);
connect(m_mediaPlayer, &QMediaPlayer::stateChanged,
this, &VideoPlayer::mediaStateChanged);
connect(m_mediaPlayer, &QMediaPlayer::positionChanged, this, &VideoPlayer::positionChanged);
connect(m_mediaPlayer, &QMediaPlayer::durationChanged, this, &VideoPlayer::durationChanged);
connect(m_mediaPlayer, QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error),
this, &VideoPlayer::handleError);
}
VideoPlayer::~VideoPlayer()
{
}
void VideoPlayer::openFile()
{
QFileDialog fileDialog(this);
fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
fileDialog.setWindowTitle(tr("Open Movie"));
QStringList supportedMimeTypes = m_mediaPlayer->supportedMimeTypes();
if (!supportedMimeTypes.isEmpty())
fileDialog.setMimeTypeFilters(supportedMimeTypes);
fileDialog.setDirectory(QStandardPaths::standardLocations(QStandardPaths::MoviesLocation).value(0, QDir::homePath()));
if (fileDialog.exec() == QDialog::Accepted)
setUrl(fileDialog.selectedUrls().constFirst());
}
void VideoPlayer::setUrl(const QUrl &url)
{
m_errorLabel->setText(QString());
setWindowFilePath(url.isLocalFile() ? url.toLocalFile() : QString());
m_mediaPlayer->setMedia(url);
m_playButton->setEnabled(true);
}
void VideoPlayer::play()
{
switch (m_mediaPlayer->state()) {
case QMediaPlayer::PlayingState:
m_mediaPlayer->pause();
break;
default:
m_mediaPlayer->play();
break;
}
}
void VideoPlayer::mediaStateChanged(QMediaPlayer::State state)
{
switch(state) {
case QMediaPlayer::PlayingState:
m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
break;
default:
m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
break;
}
}
void VideoPlayer::positionChanged(qint64 position)
{
m_positionSlider->setValue(position);
}
void VideoPlayer::durationChanged(qint64 duration)
{
m_positionSlider->setRange(0, duration);
}
void VideoPlayer::setPosition(int position)
{
m_mediaPlayer->setPosition(position);
}
void VideoPlayer::handleError()
{
m_playButton->setEnabled(false);
const QString errorString = m_mediaPlayer->errorString();
QString message = "Error: ";
if (errorString.isEmpty())
message += " #" + QString::number(int(m_mediaPlayer->error()));
else
message += errorString;
m_errorLabel->setText(message);
}