自动售货机Qt部分小结

  1. Qt页面设计

(1)主页面

该页面为主页面,Logo未设计随便找张图代替。以下是头文件中信号和槽函数的声明:

class Widget : public QWidget
{
    Q_OBJECT

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

signals://信号
    void SuccessfulSendBuy();//购买

    void SuccessfulSendClose();//关闭

    void SuccessfulSendLogin();//登陆

private slots://槽函数
    void on_buttonbuy_clicked();

    void on_buttonclose_clicked();

    void on_buttonlogin_clicked();

private:
    Ui::Widget *ui;
    Login m_login;//登陆页面
};

 核心代码如下:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->show();
    //lambda函数作为槽函数,函数体内即为执行语句
    auto f = [=](){
      m_login.show();
      this->hide();
    };
    auto f1 = [=](){
        this->show();
        m_login.hide();
    };
    auto f2 = [=](){
        this->show();
        m_login.closewindow();
    };

    //进入购买的信号连接
    connect(this,&Widget::SuccessfulSendBuy,&m_login,f);
    //管理端登陆的信号连接
    connect(this,&Widget::SuccessfulSendLogin,&m_login,f);
    //关闭按钮的信号连接
    connect(this,&Widget::SuccessfulSendClose,this,[=](){exit(0);});
    //退出登陆页面的链接
    connect(&m_login,&Login::SuccessfulExit,this,f1);
    connect(&m_login,&Login::moreExit,this,f2);
}

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

void Widget::on_buttonbuy_clicked()
{
    emit SuccessfulSendBuy();//按下按键即触发信号
}

void Widget::on_buttonclose_clicked()
{
    emit SuccessfulSendClose();
}

void Widget::on_buttonlogin_clicked()
{
    emit SuccessfulSendLogin();
}

2.登陆页面

该页面为登陆界面,输入账号密码即可登陆,输错会有警示窗口提示,也可以显示密码。

该页面头文件如下:

class Login : public QWidget
{
    Q_OBJECT

public:
    explicit Login(QWidget *parent = 0);
    ~Login();

    void closewindow();//关闭该窗口

signals:
    void SuccessfulLanding();//登陆成功信号

    void SuccessfulExit();//退出

    void SuccessfulDisplay();//显示

    void moreExit();//退出(另)

private slots:
    void on_Loginbtn_clicked();

    void on_exitbtn_clicked();

    void on_displaypassword_clicked();

    void cometo();


private:
    Ui::Login *ui;
    LoginMainWindow mainwindow;
};

 核心代码如下:

#include "login.h"
#include "ui_login.h"

Login::Login(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Login)
{
    ui->setupUi(this);
    //lambda表达式作为槽函数
    auto f = [=](){
        mainwindow.show();
        this->close();
    };
    auto f1 = [=]()
    {
        if(ui->displaypassword->isChecked())
            ui->PasswordlineEdit->setEchoMode(QLineEdit::Normal);
        else
            ui->PasswordlineEdit->setEchoMode(QLineEdit::Password);
    };
    //登陆成功连接
    connect(this,&Login::SuccessfulLanding,&mainwindow,f);
    //密码密文和显示密码连接
    connect(this,&Login::SuccessfulDisplay,ui->displaypassword,f1);
    //退出登录页,返回菜单主页面
    connect(&mainwindow,&LoginMainWindow::SuccessfulExit1,this,&Login::cometo);

}

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

void Login::on_Loginbtn_clicked()
{
    //得到用户输入的账号和密码
    QString ID = ui->IDlineEdit->text();
    QString password = ui->PasswordlineEdit->text();
    //匹配密码是否正确
    QList<Good> xGoods;
    manage m(xGoods);
    if(m.Landing(ID,password))
        emit SuccessfulLanding();//发送登陆信号
    else
        QMessageBox::warning(this,"提示!","密码输入错误!");//错误提示
}

void Login::on_exitbtn_clicked()
{
    emit SuccessfulExit();
}

void Login::on_displaypassword_clicked()
{
    emit SuccessfulDisplay();
}

void Login::cometo()
{
    emit moreExit();
}

void Login::closewindow()
{
    mainwindow.close();
}

3.成功登陆后的主界面:

 该页面为管理端主页面,可以进行商品的增删查改。

头文件中:

#ifndef LOGINMAINWINDOW_H
#define LOGINMAINWINDOW_H
#include <QMenu>
#include <QAction>
#include <QMainWindow>
#include "addgood.h"
#include <QTableWidget>
namespace Ui {
class LoginMainWindow;
}

class LoginMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit LoginMainWindow(QWidget *parent = 0);
    ~LoginMainWindow();
    void formdisplay();

signals:
    void SuccessfulExit1();

    void SuccessfulSendAdd();

    void Successfulfind();

private slots:
    void on_pushButton_clicked();

    void on_add_clicked();

    void on_find_clicked();

    void on_treeWidget_clicked(const QModelIndex &index);

private:
    Ui::LoginMainWindow *ui;
    addgood Anewgood;
    Good tmpgood;
};

#endif // LOGINMAINWINDOW_H

核心代码:

#include "loginmainwindow.h"
#include "ui_loginmainwindow.h"
#include <QListIterator>
#include <QStandardItemModel>
#include <QTableWidget>
#include <QCheckBox>
#include <QString>
#include <QMessageBox>
LoginMainWindow::LoginMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::LoginMainWindow)
{
    ui->setupUi(this);

    //此处写lambda函数。
    auto f = [=](){
        QList<Good>::iterator it ;//定义迭代器
        it = Anewgood.goods.end()-1;//加最后一个结点即可
        int rowcount = ui->tableWidget->rowCount(); //获得当前行数
        ui->tableWidget->insertRow(rowcount);//在行数的基础上再增加一行
        QCheckBox *qcb = new QCheckBox(it->name);//QcheckBox定义控件
        ui->tableWidget->setCellWidget(rowcount,0,qcb);//在单元格中加入控件
        //添加该行每列单元格的元素 参数列表:setItem(行,列,一个单元格)
        ui->tableWidget->setItem(rowcount, 1, new QTableWidgetItem(QString::asprintf("%.2f",it->price)));
        ui->tableWidget->setItem(rowcount, 2, new QTableWidgetItem(QString::asprintf("%d",it->num)));
        ui->tableWidget->setItem(rowcount, 3, new QTableWidgetItem(QString::asprintf("%d",it->sales)));
        ui->tableWidget->setItem(rowcount, 4, new QTableWidgetItem(it->information));
        //使内容居中
        for(int j = 1;j < 5;j++)
            ui->tableWidget->item(rowcount,j)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); // i代表行,j代表列
    };
    ui->tableWidget_2->insertRow(0);
    //思路与f相似
    auto f2 = [=](){
        QCheckBox *qcb = new QCheckBox(tmpgood.name);
        ui->tableWidget_2->setCellWidget(0,0,qcb);
        ui->tableWidget_2->setItem(0, 1, new QTableWidgetItem(QString::asprintf("%.2f",tmpgood.price)));
        ui->tableWidget_2->setItem(0, 2, new QTableWidgetItem(QString::asprintf("%d",tmpgood.num)));
        ui->tableWidget_2->setItem(0, 3, new QTableWidgetItem(QString::asprintf("%d",tmpgood.sales)));
        ui->tableWidget_2->setItem(0, 4, new QTableWidgetItem(tmpgood.information));
        for(int j = 1;j < 5;j++)
            ui->tableWidget_2->item(0,j)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); // i代表行,j代表列
    };

    //将增加按钮和对应的窗口链接
    connect(this,&LoginMainWindow::SuccessfulSendAdd,&Anewgood,[=](){Anewgood.show();});
    //将增加窗口中的成功添加按钮与本窗口链接
    connect(&Anewgood,&addgood::SuccessfulAdd,this,f);
    //将查找键与小窗口第二页连接
    connect(this,&LoginMainWindow::Successfulfind,this,f2);

    //以下操作是在写侧栏——树。(暂未封装,感觉也不太需要)
    ui->treeWidget->setColumnCount(1); //显示
    QStringList l;  //给个String列表,后面的函数参数给定类型为QStringList,故不能直接用String
    l << "商品概览"; //商品概览
    QTreeWidgetItem *pf1 = new QTreeWidgetItem(ui->treeWidget,l);//创建一个树的结点,父亲为treeWidge
    ui->treeWidget->addTopLevelItem(pf1);//增加到侧栏
    //与上述一致,不过多注释
    l.clear();
    l << "销售情况";
    QTreeWidgetItem *pf2 = new QTreeWidgetItem(ui->treeWidget,l);
    ui->treeWidget->addTopLevelItem(pf2);
    /*
    l.clear();
    l << "商品新增存入";
    QTreeWidgetItem *pf2 = new QTreeWidgetItem(ui->treeWidget,l);

    l.clear();
    l << "商品新增存入";
    QTreeWidgetItem *pf2 = new QTreeWidgetItem(ui->treeWidget,l);*/
    formdisplay(); //首页的表格页初始化并显示
}

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

void LoginMainWindow::on_pushButton_clicked()
{
    emit SuccessfulExit1();
}

void LoginMainWindow::on_add_clicked()
{
    emit SuccessfulSendAdd();
}


void LoginMainWindow::formdisplay()
{
   //与上述f思路一致
    QList<Good>::iterator it ;
    it = Anewgood.goods.begin();
    int i = ui->tableWidget->rowCount();;
    while (it != Anewgood.goods.end())
    {
        ui->tableWidget->insertRow(i);
        QCheckBox *qcb = new QCheckBox(it->name);
        ui->tableWidget->setCellWidget(i,0,qcb);
        ui->tableWidget->setItem(i, 1, new QTableWidgetItem(QString::asprintf("%.2f",it->price)));
        ui->tableWidget->setItem(i, 2, new QTableWidgetItem(QString::asprintf("%d",it->num)));
        ui->tableWidget->setItem(i, 3, new QTableWidgetItem(QString::asprintf("%d",it->sales)));
        ui->tableWidget->setItem(i, 4, new QTableWidgetItem(it->information));
        for(int j = 1;j < 5;j++)
            ui->tableWidget->item(i,j)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); // i代表行,j代表列
        *it++;
        i++;
    }
    //将第一列的宽度重新设置一下
    ui->tableWidget->setColumnWidth(0, 100);
}
//没开始写
void LoginMainWindow::on_treeWidget_clicked(const QModelIndex &index)
{

}

//搜索按钮槽函数
void LoginMainWindow::on_find_clicked()
{
    //定义一个类,用于进行搜索操作
    manage m(Anewgood.goods);
    QString str = ui->lineEdit->text();//获取用户输入的商品名称
    bool x = 0;
    tmpgood = m.GoodLookOne(x,str); //调用m中的查找函数,并返回查找到的结构体

    if(x)
    {
        ui->stackedWidget->setCurrentWidget(ui->findone);//换页
        emit Successfulfind();//触发信号
    }
    else
        QMessageBox::warning(this,"提示!","您查找的商品不存在!");//提示窗
}

4.增加商品窗口

该界面由用户输入,增加到商品中。

头文件:

#ifndef ADDGOOD_H
#define ADDGOOD_H

#include <QWidget>
#include "good.h"
#include <QList>
#include <QString>
#include <QMessageBox>
#include <QCheckBox>
#include <QTreeWidget>
#include <QStringList>

namespace Ui {
class addgood;
}

class addgood : public QWidget
{
    Q_OBJECT

public:
    explicit addgood(QWidget *parent = 0);
    ~addgood();
    QList<Good> goods;

signals:
    void SuccessfulAdd();

    void SuccessfulCancel();

private slots:
    void on_sureadd_clicked();

    void on_Cancel_clicked();

private:
    Ui::addgood *ui;

};

#endif // ADDGOOD_H

 核心代码

#include "addgood.h"
#include "ui_addgood.h"

addgood::addgood(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::addgood)
{
    ui->setupUi(this);

    auto f = [=](){
        this->close();
        QMessageBox::information(this,"提示!","添加成功");
    };
    //添加成功提示,按钮信号连接
    connect(this,&addgood::SuccessfulAdd,this,f);
    //取消添加,关闭窗口
    connect(this,&addgood::SuccessfulCancel,this,[=](){this->hide();});

}

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

//确定增加的槽函数
void addgood::on_sureadd_clicked()
{
    //得到用户输入的信息,并用结构体储存成为一个结点
    Good newgood;
    newgood.name = ui->Name->text();
    newgood.price = ui->price->text().toFloat();
    newgood.num = ui->nun->text().toInt();
    newgood.information = ui->information->text();
    manage m(goods);
    //调用类中函数增加
    m.GoodAdd(newgood);
    emit SuccessfulAdd();//发送信号,添加成功
}


void addgood::on_Cancel_clicked()
{
    emit SuccessfulCancel();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值