Qt菜谱管理系统

系统采用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);
}
采用C/S模式,完成一前台(服务器)对多客服端通讯,用Mysql数据库保存信息; 主要技术: 1.采用TCP/IP协议,容器完成服务端与多客户端的链接 服务端: server=new QTcpServer(this);建立端口 server->listen(QHostAddress::Any,PORT);监听端口 connect(server,SIGNAL(newConnection()),this,SLOT(accpetConnection()));等待用户链接 QTcpSocket* temp = server->nextPendingConnection();建立链接 client.push_back(temp);用户压栈 connect(temp,SIGNAL(readyRead()),this,SLOT(readData()));当端口有数据就读 读数据时先用迭代器遍历容器找到发送信息的客户端,再解析数据并响应 客户端: client=new QTcpSocket(this);建立端口 client->connectToHost(IP,PORT);链接主机 connect(client,SIGNAL(readyRead()),this,SLOT(readData()));端口有数据就读 2.界面布局 服务器 a.主菜单,预订,开台,换台,电子账单功能项采用QToolButton文字置于图片下面,水平布局 b.当前餐台信息与总餐台状态信息用QLabel垂直布局放于主窗体左侧 c.餐台信息采用QGraphicsView+QGraphicsScene+QGraphicsItem布局,view与item需要重写自己的类,Item包括图片与文本信息;将Item放入墙纸scene中,墙纸scene贴到墙view上完成显示。 客户端 a.选择桌号与人数用QLabel,对应的下拉选项用QComboBox,确认,呼叫与结账功能用QToolButton,这些控件水平布局放置于窗体最上方 b.左侧用QTabWidget其中加入特价菜单与我的菜单两个子窗体 c.中间为QGraphicsView+QGraphicsScene+QGraphicsItem布局,布局菜单图片与价格名称,菜单信息服务器发送至客户端与客户端的图片匹配起来。 d.右侧为菜单类型分类按键,采用垂直布局 3.信号与槽机制的运用 a.预订,开台,换台功能的实现:点击对应的按钮触发clicked()信号,与之对应的槽函数中QToolButton *btn = (QToolButton *)sender();区分信号源,弹出对应的子窗体让用户输入相应信息,按确定按钮修改SQL对应Table内容然后发送输入信息信号,主窗体接受到信号调用槽函数(相应窗体成员调用其布局函数重布局)重新布局整个界面(餐台信息与左侧总餐台状态同时更新) b.鼠标悬浮于餐台信息Item时图片放大:改写了QGraphicsSceneMouseEvent事件实现 c.主菜单与电子账单的显示采用QSqlTableModel+QTableView加载整个SQL中相应的Table显示Table内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值