- 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();
}