40数据库练习
例子解析:
連接數據庫,將數據庫的數據映射到設計器,可以在設計器中進行買賣操作,或添加車輛。確定后更新到數據庫,右方顯示賣車記錄。
?
?
數據庫數據
用于廠家的組合框
?
?
用于各數據的查詢,通過廠家和品牌為標識
?
?
?
?
?
?
源代碼:
mainwindow.h
?
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
?
#include <QMainWindow>
?
namespace Ui {
class MainWindow;
}
?
class MainWindow : public QMainWindow
{
??? Q_OBJECT
?
public:
??? explicit MainWindow(QWidget *parent = 0);
??? ~MainWindow();
?
??? void connectDB();?? //連接數據庫
??? void initData();??? //初始化數據庫
?
private slots:
??? void on_menuCar_triggered();
?
??? void on_menuCalc_triggered();
?
??? void on_factory_currentIndexChanged(const QString &arg1);
?
??? void on_brand_currentIndexChanged(const QString &arg1);
?
??? void on_num_valueChanged(int arg1);
?
??? void on_sure_clicked();
?
??? void on_cancel_clicked();
?
private:
??? Ui::MainWindow *ui;
};
?
#endif // MAINWINDOW_H
?
?
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QMessageBox>
#include <QtSql/QSqlQueryModel>
#include <QtSql/QSqlQuery>
?
#include <QDebug>
?
MainWindow::MainWindow(QWidget *parent) :
??? QMainWindow(parent),
??? ui(new Ui::MainWindow)
{
??? ui->setupUi(this);
??? //初始開始頁面 車輛管理
??? MainWindow::on_menuCar_triggered();
?
??? MainWindow::connectDB();
??? MainWindow::initData();
}
?
MainWindow::~MainWindow()
{
??? delete ui;
}
?
//車輛管理菜單
void MainWindow::on_menuCar_triggered()
{
??? ui->stackedWidget->setCurrentWidget(ui->car);
??? ui->label->setText("車輛管理");
}
//銷售統計菜單
void MainWindow::on_menuCalc_triggered()
{
??? ui->stackedWidget->setCurrentWidget(ui->calc);
??? ui->label->setText("銷售統計");
}
?//連接數據庫
void MainWindow::connectDB()
{
??? QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
??? db.setHostName("127.0.0.1");
??? //db.setPassword("1234");
??? db.setUserName("root");
??? db.setDatabaseName("car");
?
?
??? if(!db.open())
??? {
??????? QMessageBox::warning(this,"數據庫打開失敗",db.lastError().text());
??????? return ;
??? }
?
}
//初始化數據庫
void MainWindow::initData()
{
??? //新建模型
??? QSqlQueryModel *queryModel=new QSqlQueryModel(this);
??? queryModel->setQuery("SELECT sname FROM factory;");
?
??? ui->factory->setModel(queryModel);
?
??? ui->lastnum->setText("0");
??? ui->allprice->setEnabled(false);
}
?
?
//廠家組合框槽函數
void MainWindow::on_factory_currentIndexChanged(const QString &arg1)
{
? ??if(arg1=="changjia")
??? {
??????? ui->brand->clear();
??????? ui->price->clear();
??????? ui->num->setValue(0);
??????? ui->allprice->clear();
??????? ui->lastnum->setText("0");
??????? ui->sure->setEnabled(false);
??? }
??? else
??? {
??????? ui->brand->clear();
??????? QSqlQuery query;
??????? QString sql=QString("SELECT sname FROM brand WHERE factory ='%1'").arg(arg1);
??????? //SELECT sname FROM brand WHERE factory ='yiqi';
??????? //執行SQL語句
??????? query.exec(sql);
??????? //獲取內容
??????? while(query.next())
??????? {
??????????? QString name=query.value(0).toString();
??????????? ui->brand->addItem(name);
??????? }
??? }
}
//品牌組合框槽函數
void MainWindow::on_brand_currentIndexChanged(const QString &arg1)
{
??? QSqlQuery query;
??? QString sql=QString("SELECT price,llast FROM brand WHERE factory ='%1'"
??????????????????????? "AND sname='%2'").arg(ui->factory->currentText()).arg(arg1);
??? //SELECT price FROM brand WHERE factory ='yiqi' AND sname='aodi';
??? //執行SQL語句
??? query.exec(sql);
??? //獲取內容
??? while(query.next())
??? {
??????? //報價
??????? int price=query.value("price").toInt();
??????? //剩余數目
??????? int last=query.value("llast").toInt();
?
??????? //更新
??????? ui->price->setText(QString::number(price));
??????? ui->lastnum->setText(QString::number(last));
??? }
}
//數據選擇框槽函數
void MainWindow::on_num_valueChanged(int arg1)
{
??? //更新剩余數量
??? //1)廠家
??? QString factoryStr=ui->factory->currentText();
??? //2)品牌
??? QString brandStr=ui->brand->currentText();
?
??? if(arg1==0)
??? {
??????? ui->sure->setEnabled(false);
??? }
??? else
??? {
???????? ui->sure->setEnabled(true);
??? }
?
??? //獲取數據庫剩余數量
??? QSqlQuery query;
??? QString sql=QString("SELECT ssum,llast FROM brand WHERE factory ='%1'"
??????????????????????? "AND sname='%2'").arg(factoryStr).arg(brandStr);
??? int lastnum=0;
??? //執行SQL語句
??? query.exec(sql);
??? while(query.next())
??? {
??????? //剩余數目
??????? lastnum=query.value("llast").toInt();
??? }
??? //選擇數大于剩余數目
??? if(arg1>lastnum)
??? {
??????? ui->num->setValue(lastnum);
??????? return;
??? }
??? //更新剩余數量
??? int tempnum=lastnum-arg1;
??? ui->lastnum->setText(QString::number(tempnum));
?
??? //金額
??? int price=ui->price->text().toInt();
??? int sum=price*arg1;
??? ui->allprice->setText(QString::number(sum));
?
}
//確定按鈕
void MainWindow::on_sure_clicked()
{
??? //獲取信息
??? //1)銷售數據
??? int num=ui->num->value();
??? //2)剩余數目
??? int last=ui->lastnum->text().toInt();
?
??? //獲取數據庫的銷量
??? QSqlQuery query;
??? QString sql=QString("SELECT sell,price FROM brand WHERE factory ='%1'"
? ??????????????????????"AND sname='%2'").arg(ui->factory->currentText()).arg(ui->brand->currentText());
??? //SELECT sell FROM brand WHERE factory ='yiqi' AND sname='oudi';
??? //執行SQL語句
??? query.exec(sql);
?
??? int sell=0,price=0;
??? //獲取內容
??? while(query.next())
??? {
??????? //銷量
??????? sell=query.value("sell").toInt();
??????? //單價
??????? price=query.value("price").toInt();
??? }
?
??? sell+=num;
?
??? //更新數據庫,剩余數量、銷售總量
??? sql=QString("UPDATE brand SET sell=%1,llast=%2 where factory='%3' "
??????????????????????? "AND sname='%4'")
??????????????????????? .arg(sell)
??????????????????????? .arg(last)
??????????????????????? .arg(ui->factory->currentText())
??????????????????????? .arg(ui->brand->currentText());
??? query.exec(sql);
???
??? //銷售記錄
??? QString str=QString("廠家:%1,品牌:%2,銷售了%3輛,單價%4萬元,總價%5萬元")
??????????????? .arg(ui->factory->currentText())
??????????????? .arg(ui->brand->currentText())
??????????????? .arg(num)
??????????????? .arg(price)
??????????????? .arg(num*price);
??? ui->info->append(str);
?
??? //更新數據庫后
??? ui->sure->setEnabled(false);
??? MainWindow::on_cancel_clicked();
?
?
}
//取消按鈕
void MainWindow::on_cancel_clicked()
{
??? //MainWindow::on_factory_currentIndexChanged("changjia");
??? ui->factory->setCurrentIndex(0);
??? ui->lastnum->setText("0");
}
?
?
結果圖:
?
?
?
被修改了
?
?
轉載于:https://www.cnblogs.com/gd-luojialin/p/9215912.html
總結
- 上一篇: 简历表页面的制作
- 下一篇: EUV光刻技术如何为功率半导体提供动力