中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

做html網(wǎng)站免費(fèi)引流推廣怎么做

做html網(wǎng)站,免費(fèi)引流推廣怎么做,建立網(wǎng)站導(dǎo)航欄的方法,申請(qǐng)注冊(cè)公司流程及費(fèi)用目錄 第一章 UI界面設(shè)計(jì)與開發(fā) 登錄界面 主界面 UI美化 第二章 數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā) 數(shù)據(jù)庫(kù)設(shè)計(jì) 連接數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)功能設(shè)計(jì) sql語(yǔ)句設(shè)計(jì) 查詢所有學(xué)生數(shù)量 查詢第幾頁(yè)學(xué)生數(shù)據(jù) 刪除學(xué)生 修改學(xué)生信息 清空學(xué)生表 添加單個(gè)用戶 刪除單個(gè)用戶 修改用戶權(quán)限 查詢所有用戶…

目錄

第一章 UI界面設(shè)計(jì)與開發(fā)

登錄界面

主界面

UI美化

第二章 數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)

數(shù)據(jù)庫(kù)設(shè)計(jì)

連接數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)功能設(shè)計(jì)

sql語(yǔ)句設(shè)計(jì)

查詢所有學(xué)生數(shù)量

?查詢第幾頁(yè)學(xué)生數(shù)據(jù)

刪除學(xué)生

修改學(xué)生信息

?清空學(xué)生表

?添加單個(gè)用戶

?刪除單個(gè)用戶

?修改用戶權(quán)限

?查詢所有用戶

查詢用戶是否存在

數(shù)據(jù)庫(kù)函數(shù)設(shè)計(jì)

sql函數(shù)設(shè)計(jì)

學(xué)生表操作

Init()

getStuCnt()?

?getPageStu()

addStu()

??delStu()

updateInfo()

?clearStuInfo()

用戶表操作

addUser()

delUser()

UpdateUserAut()

getAllUser()

isExists()

模擬數(shù)據(jù)

創(chuàng)建單例

查詢

?修改

清空學(xué)生表

優(yōu)化

打包

樣式打包

數(shù)據(jù)庫(kù)打包


第一章 UI界面設(shè)計(jì)與開發(fā)

登錄界面

第一步先做登錄界面

新建一個(gè)文件,命名為Page_login.

在MainWindows.h頭文件里聲明一個(gè)Page_login類型的變量m_dlgloin:

先放置控件:

設(shè)置控件屬性

然后我們將用戶名輸入和密碼輸入框設(shè)置成為默認(rèn)顯示:

將密碼輸入框的模式改為密碼模式:

將用戶名和密碼輸入長(zhǎng)度限制為8位:

在MainWindows.cpp文件里調(diào)用我們我們m_dlogin窗口,并且把主窗口阻塞不顯示:

初步登錄界面如下:

右擊按鈕選擇轉(zhuǎn)到槽:會(huì)自動(dòng)生成框架:

我們接下來(lái)登錄和退出的邏輯

退出

exit(0);

登錄

登錄一般是在數(shù)據(jù)庫(kù)查找用戶名和密碼,查找到了就發(fā)送一個(gè)signal顯示成功了:

如果失敗就提示登錄失敗.

在Mainwindows.cpp里寫下面這段代碼,表示如果主界面捕獲到來(lái)自登錄界面登錄成功的信號(hào),那么就跳到主界面:

主界面

主界面放置如下控件:效果圖如下:

改變一下背景色

往treewidget里添加信息

需要用到的函數(shù):

所以我們需要new一個(gè) QTreeWidgetItem 類型對(duì)象.QTreeWidgetItem?的構(gòu)造函數(shù)如下:第一個(gè)參數(shù)要為自身,第二個(gè)參數(shù)想用字符串的話只能構(gòu)造一個(gè)qstringlist類型的參數(shù)

效果圖:

讓文字居左顯示(把indentation設(shè)為小一點(diǎn)):

構(gòu)造兩個(gè)子集目錄:學(xué)生管理,管理員管理

效果圖如下:

數(shù)據(jù)模擬

把我們之前的stackwidget設(shè)置一個(gè)背景色,然后在stackwidget里加一個(gè)tablewidget控件,給tablewidget加幾列數(shù)據(jù),效果圖如下:

UI美化

在Mainwindows.cpp里面的Widget類里面有一個(gè)keyPressEvent()鍵盤響應(yīng)事件函數(shù),它的聲明如下:

 virtual void keyPressEvent(QKeyEvent *event);

?我們?cè)贛ainwindows.h文件里進(jìn)行聲明,然后在Mainwindows.cpp文件進(jìn)行定義.定義如下:

我們通過f6鍵進(jìn)行換膚,首先提前新建一個(gè)stucss.css文件,在里面我們要換的樣式寫好,然后在我們按完F6之后將其加載進(jìn)我們的UI界面

void MainWindow::keyPressEvent(QKeyEvent *event)
{if(event->key()==Qt::Key_F6){QFile f;auto  str=QCoreApplication::applicationDirPath(); //獲取application的路徑f.setFileName(str+"//"+"stucss.css"); //將路徑后加上我們皮膚的路徑f.open(QIODevice::ReadOnly);  //以只讀方式打開QString str2=f.readAll();     //讀取this->setStyleSheet(str2);    //設(shè)置樣式m_dlgloion.setStyleSheet(str2);//采用樣式}
}

?stucss.css代碼如下:

/* 登錄界面 */
QPushButton{color:white;background-color:#34495e;border-radius:6;} /*按鈕*/
QLabel{color:#34495e;} /*標(biāo)簽*/
QLabel#lb1{color:#34495e;font-size: 22;} /*用戶名標(biāo)簽*/
QLabel#lb2{color:#34495e;font-size: 22;} /*密碼標(biāo)簽*/
QLineEdit{border: 2px solid #bdc3c7; min-height:22; border-radius: 6px;}/*搜索框 *//* 主界面 */
/* Widget#background-color:#34495e; */
QLabel[lab="main"]{color:white;}
QWidget#widget[bg_title="main"]{background-color:#34495e;}
QWidget#widget_3{background-color:#34495e;}
QPushButton[btn="main"]{font-family:"微軟雅黑";min-height:22px;min-width:80px;background-color: #16a085;border-radius:6; } /*主界面按鈕*/
QPushButton[btn="main"]:pressed{font-family:"微軟雅黑";min-height:22px;min-width:80px;background-color: #2a5d53;border-radius:6; } /*按鈕按壓變色*//*左側(cè)界面樣式*/
QTreeWidget{font-family:"宋體";font-size:15px;background-color: rgba(52, 73, 94, 150); color:white;} QStackedWidget{border:1px solid gray;} 邊框/*右側(cè)界面樣式*/
QHeaderView::section           
{ font-size:16px;font-family: "宋體";text-align:center;    height:30px;     color:#909399;font-weight: bold;border:1px solid gray;border-left:none;/* border-bottom-color: rgb(168, 171, 180); */
}QTableWidget::item
{font:14px "微軟雅黑";color:#667483;border:none;
}

?優(yōu)化完之后的效果如下所示:

第二章 數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)

數(shù)據(jù)庫(kù)設(shè)計(jì)

新建兩張表,sql語(yǔ)句如下:

學(xué)生表

CREATE TABLE "student" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,"name" TEXT,"age" integer,"grade" integer,"class" integer,"studentid  " integer,"phone" TEXT,"wechat" TEXT
);

?用戶表

CREATE TABLE "username" ("username" TEXT,"password" TEXT,"auth" TEXT
);

此時(shí)數(shù)據(jù)庫(kù)里就有兩張表了

創(chuàng)建一個(gè)新的基于OBject類的頭文件,命名為stusql.cpp

在這個(gè)文件進(jìn)行數(shù)據(jù)庫(kù)操作

連接數(shù)據(jù)庫(kù)

連接數(shù)據(jù)庫(kù)的模板如下:

#include "stusql.h"
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>stusql::stusql(QObject *parent ): QObject {parent}
{// 檢查是否有可用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)if (QSqlDatabase::drivers().isEmpty()) {// 確保 stusql 類是 QObject 的子類,否則需要傳遞一個(gè)有效的 QWidget 指針或 nullptrQMessageBox::information(nullptr, tr("No database drivers found"),tr("This demo requires at least one Qt database driver. ""Please check the documentation how to build the ""Qt SQL plugins."));return;}QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接db.setDatabaseName("./data.db");if (!db.open()) {qDebug() << "數(shù)據(jù)庫(kù)文件加載失敗: " << db.lastError().text();// 這里可能需要處理錯(cuò)誤,比如顯示一個(gè)消息框或者記錄日志return; // 數(shù)據(jù)庫(kù)打開失敗,構(gòu)造函數(shù)不應(yīng)該繼續(xù)執(zhí)行}qDebug() << "打開數(shù)據(jù)庫(kù)文件成功";

此時(shí)構(gòu)建完之后控制臺(tái)顯示

?然后我們可以向數(shù)據(jù)庫(kù)里插一條數(shù)據(jù)看一下是否可以插入成功:

語(yǔ)句如下:

  QSqlQuery q("", db);if (!q.exec("INSERT INTO student VALUES (NULL ,'張三',12,3,2,1,15518978071,'aasDASD')")) {qDebug() << "插入數(shù)據(jù)失敗: " << q.lastError().text();// 這里應(yīng)該處理SQL執(zhí)行錯(cuò)誤}

此時(shí)構(gòu)建完之后控制臺(tái)顯示:

我們現(xiàn)在可以讓插入失敗的原因可視化的顯示出來(lái):

    if (!q.exec("INSERT INTO student VALUES (NULL ,'張三',12,3,2,1,15518978071,'aasDASD')")) {QMessageBox::critical(nullptr, tr("Database Error"),tr("Failed to insert data: %1").arg(q.lastError().text()));// 顯示具體的錯(cuò)誤信息}

這樣的話就會(huì)有一個(gè)斷言:顯示表不存在?

我把路徑換成絕對(duì)路徑就可以了:

db.setDatabaseName("D:\\QTproject\\stumanger\\data.db");

現(xiàn)在數(shù)據(jù)庫(kù)里student表就被插入一條數(shù)據(jù)了:

數(shù)據(jù)庫(kù)功能設(shè)計(jì)

sql語(yǔ)句設(shè)計(jì)

查詢所有學(xué)生數(shù)量

select count(id) from student;

?查詢第幾頁(yè)學(xué)生數(shù)據(jù)

offset代表從第幾條記錄之后"開始"查詢,limit表示查詢多少條結(jié)果

select * from student order by id limit 2 offset 1;

刪除學(xué)生

delete from student where id = 1;

修改學(xué)生信息

update student set name = 'asd' where id=25;

?清空學(xué)生表

delete from student



?添加單個(gè)用戶

INSERT INTO "username" VALUES ('admin', 111, 'admin');

?刪除單個(gè)用戶

delete from username where username='admin';

?修改用戶權(quán)限

update username set auth='user';

?查詢所有用戶

select * from username

查詢用戶是否存在

select *from username where username='admin';

數(shù)據(jù)庫(kù)函數(shù)設(shè)計(jì)

實(shí)現(xiàn)基礎(chǔ)的數(shù)據(jù)庫(kù)增刪查改功能,在stusql.h文件里列出以下聲明:

首先創(chuàng)建兩個(gè)結(jié)構(gòu)體

在stusql.cpp文件里實(shí)現(xiàn)定義:

sql函數(shù)設(shè)計(jì)

學(xué)生表操作

Init()

在初始化的時(shí)候進(jìn)行數(shù)據(jù)庫(kù)連接

void stusql::Init()
{m_db = QSqlDatabase::addDatabase("QSQLITE"); // 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接m_db.setDatabaseName("D:\\QTproject\\stumanger\\data.db");#if 0auto str=QCoreApplication::applicationDirPath();  //獲取一下數(shù)據(jù)庫(kù)的路徑,目的是為了發(fā)布時(shí)找到數(shù)據(jù)庫(kù)將其放于當(dāng)前目錄下qDebug()<<str;
#endifif (!m_db.open()) {QMessageBox::critical(nullptr, tr("Database Error"),tr("Failed to open database: %1").arg(m_db.lastError().text()));return; // 數(shù)據(jù)庫(kù)打開失敗,構(gòu)造函數(shù)不應(yīng)該繼續(xù)執(zhí)行}qDebug() << "打開數(shù)據(jù)庫(kù)文件成功";
}
getStuCnt()?
quint32 stusql::getStuCnt()
{QSqlQuery sql(m_db);sql.exec("select count(id) from student;");quint32 Cnt=0;while(sql.next()){Cnt=sql.value(0).toUInt();}qDebug() << "學(xué)生數(shù)量: " << Cnt;return Cnt;
}
?getPageStu()
QList<StuInfo> stusql::getPageStu(quint32 page, quint32 Cnt)
{QList<StuInfo> l;QSqlQuery sql(m_db);QString strsql=QString("select * from student order by id limit %1 offset %2;").arg(Cnt).arg(page*Cnt);sql.exec(strsql);StuInfo info;while(sql.next()){info.id=sql.value(0).toUInt();info.stu_name=sql.value(1).toString();info.stu_age=sql.value(2).toUInt();info.stu_grade=sql.value(3).toUInt();info.stu_class=sql.value(4).toUInt();info.stu_id=sql.value(5).toUInt();info.stu_phone=sql.value(6).toString();info.stu_wechat=sql.value(7).toString();}l.push_back(info);// qDebug()<<l.begin()->id<<l.begin()->stu_name<<l.begin()->stu_age;return l;
}
addStu()

添加記錄

bool stusql::addstu(StuInfo info)
{QSqlQuery sql(m_db);QString strsql=QString("insert into stdent values(null,'%1',%2,%3,%4,%5,'%6','%7')").arg(info.stu_name).arg(info.stu_age).arg(info.stu_grade).arg(info.stu_class).arg(info.stu_id).arg(info.stu_phone).arg(info.stu_wechat);if(!sql.exec(strsql)){QMessageBox::critical(nullptr, tr("Database Error"),tr("Failed to insert data: %1").arg(sql.lastError().text()));// 顯示具體的錯(cuò)誤信息return false;}return true;
}
??delStu()
bool stusql::delStu(int id)
{QSqlQuery sql(m_db);QString strsql=QString("delete from student where id= %1;").arg(id);if(sql.exec(strsql)){return true;}else qDebug()<<"刪除失敗!";return false;
}
updateInfo()

修改學(xué)生信息

bool stusql::updateInfo(StuInfo info)
{QSqlQuery sql(m_db);QString strsql=QString("update student set name = '%1' where id=%2;").arg(info.stu_name).arg(info.stu_id);bool res=sql.exec(strsql);QSqlError e=sql.lastError();if(sql.isValid()){qDebug()<<e.text();}return res;
}

發(fā)現(xiàn)怎么修改都無(wú)法修改,后來(lái)發(fā)現(xiàn)是建表的問題(字段名后面有空格)

?clearStuInfo()

清空學(xué)生表

void stusql::clearStuInfo()
{QSqlQuery sql(m_db);QString strsql=QString("delete from student");sql.exec(strsql);
}

在表設(shè)計(jì)視圖里面把這些空格刪掉就可以了



用戶表操作

addUser()
//添加單個(gè)用戶
bool stusql::addUser(UserInfo info)
{QSqlQuery sql(m_db);QString strsql = QString("INSERT INTO username VALUES ('%1', '%2', '%3');").arg(info.username).arg(info.passwd).arg(info.auth);if(!sql.exec(strsql)){qDebug()<<"ERROR:"<<sql.lastError();return false;}return true;
}

delUser()
bool stusql::delUser(QString userName)
{QSqlQuery sql(m_db);QString strsql =QString("delete from username where username= '%1'").arg(userName);if(!sql.exec(strsql)){qDebug()<<"ERROR:"<<sql.lastError();return false;}return true;
}
UpdateUserAut()
bool stusql::UpdateUserAut(QString str1, QString str2)
{QSqlQuery sql(m_db);// 使用參數(shù)化查詢來(lái)避免SQL注入QString strsql = "UPDATE username SET auth = :auth WHERE username = :username;";// 綁定參數(shù)sql.prepare(strsql);sql.bindValue(":auth", str1);sql.bindValue(":username", str2);if (!sql.exec()) {qDebug() << "ERROR:" << sql.lastError();return false;}// 檢查是否有行被更新if (sql.numRowsAffected() > 0) {return true;} else {// 沒有行被更新,可能是沒有找到匹配的用戶名qDebug() << "No rows updated. User may not exist.";return false;}
}
getAllUser()
QList<UserInfo> stusql::getAllUser()
{QList<UserInfo> l; // 使用正確的類型QSqlQuery sql(m_db);QString strsql = "select * from username"; // 假設(shè)表名正確// 執(zhí)行SQL查詢if (!sql.exec(strsql)) {// 處理錯(cuò)誤,例如打印錯(cuò)誤信息qDebug() << "Error executing query:" << sql.lastError();return l; // 返回空列表或根據(jù)需要進(jìn)行錯(cuò)誤處理}UserInfo info; // 在循環(huán)內(nèi)部初始化while (sql.next()) {info.username = sql.value("username").toString(); // 假設(shè)列名為 "username"info.passwd = sql.value("passwd").toString(); // 假設(shè)列名為 "passwd"info.auth = sql.value("auth").toString(); // 假設(shè)列名為 "auth"l.push_back(info); // 在每次迭代中將info添加到列表info = UserInfo(); // 重置info對(duì)象(如果UserInfo有默認(rèn)構(gòu)造函數(shù))}auto a=l.front();qDebug()<<a.username<<a.passwd<<a.auth;return l;
}

isExists()
bool stusql::isExists(QString Name)
{QSqlQuery sql(m_db);// 使用參數(shù)化查詢來(lái)避免SQL注入,并且只查詢需要的列QString strsql = "SELECT COUNT(*) FROM username WHERE username = :name;";// 綁定參數(shù)sql.prepare(strsql);sql.bindValue(":name", Name);if (!sql.exec()) {qDebug() << "ERROR:" << sql.lastError();return false;}// 檢查是否有結(jié)果返回if (sql.next()) {// 檢查COUNT(*)是否大于0if(sql.value(0).toLongLong() > 0)qDebug()<<"用戶存在";else qDebug()<<"用戶不存在";}return false;
}

造一行數(shù)據(jù),我們發(fā)現(xiàn)左邊會(huì)有一個(gè)自增id:我們可以通過取消一個(gè)屬性將其去掉:

模擬數(shù)據(jù)

創(chuàng)建單例

創(chuàng)建單例的目的:

單例模式是qt開發(fā)的一種模式.在發(fā)布的時(shí)候有兩種模式,一種是怎么把資源載入exe文件當(dāng)中,還有一種就是在發(fā)布的時(shí)候引入外部資源,這種模式占用內(nèi)容特別少,就是單例模式.

我們?cè)趕tusql.h文件里添加單利模式的聲明

    static stusql *ptrstuSql;static stusql *getinstance(){if(ptrstuSql==nullptr){ptrstuSql=new stusql;}return  ptrstuSql;}

在stusql.cpp文件里面添加對(duì)單例的定義:

stusql *stusql::ptrstuSql=nullptr;

我們創(chuàng)建一個(gè)QStringList類型對(duì)象mlNames,然后將1000個(gè)名字讀入到mlNames里面.

然后我們?cè)谥鹘缑嫣砑右粋€(gè)按鈕命名為btn_moni,然后添加定義,定義如下:

void MainWindow::on_btn_moni_clicked()
{QString l;//制作1000條學(xué)生數(shù)據(jù)QRandomGenerator g,c;g.seed(0);c.seed(0);for(int i=0;i<mlNames.size();i++){auto rand_grade=g.bounded(7,10);auto rand_class=g.bounded(1,10);StuInfo info;info.stu_name=mlNames[i];if(i%3){info.stu_age=14;}if(i%7){info.stu_age=13;}if(i%9){info.stu_age=18;}info.stu_grade=rand_grade;info.stu_class=rand_class;info.id=i;info.stu_phone="13463464347";info.stu_wechat="sfwegewg";m_ptrStusql->addstu(info);}}

?此時(shí)我們的數(shù)據(jù)庫(kù)里就有了我們模擬的數(shù)據(jù)了:

接下來(lái)我們需要將這些數(shù)據(jù)展現(xiàn)在我們的Qtablewidget上.

我們寫一個(gè)Update()函數(shù),內(nèi)容如下:

//刷新數(shù)據(jù)
void MainWindow::updateTable()
{//把自帶的表頭刪了,我們自己來(lái)寫表頭ui->tableWidget_2->clear();//必須要告訴編譯器有多少列才能顯示表頭ui->tableWidget_2->setColumnCount(8);QStringList l;//自定義表頭l<<"序號(hào)"<<"姓名"<<"年齡"<<"年紀(jì)"<<"班級(jí)"<<"學(xué)號(hào)"<<"電話"<<"微信";ui->tableWidget_2->setHorizontalHeaderLabels(l); //設(shè)置顯示表頭ui->tableWidget_2->setSelectionBehavior(QAbstractItemView::SelectRows);  //當(dāng)用戶點(diǎn)擊任何一個(gè)單元格時(shí),整個(gè)行都會(huì)被選中//顯示數(shù)據(jù)內(nèi)容auto cnt=m_ptrStusql->getStuCnt();  //獲取記錄行數(shù)ui->lb_cnt->setText(QString("數(shù)量:%1").arg(cnt));  //顯示學(xué)生數(shù)量QList<StuInfo> lStudents=m_ptrStusql->getPageStu(0,cnt);  //獲取一共有多少頁(yè)數(shù)據(jù)ui->tableWidget_2->setRowCount(cnt);  //設(shè)置行數(shù)//將數(shù)據(jù)刷新到tablewidget上for(int i=0;i<lStudents.size();i++){ui->tableWidget_2->setItem(i,0,new QTableWidgetItem(QString::number(i)));ui->tableWidget_2->setItem(i,1,new QTableWidgetItem(lStudents[i].stu_name));ui->tableWidget_2->setItem(i,2,new QTableWidgetItem(QString::number(lStudents[i].stu_age)));ui->tableWidget_2->setItem(i,3,new QTableWidgetItem(QString::number(lStudents[i].stu_grade)));ui->tableWidget_2->setItem(i,4,new QTableWidgetItem(QString::number(lStudents[i].stu_class)));ui->tableWidget_2->setItem(i,5,new QTableWidgetItem(QString::number(lStudents[i].stu_id)));ui->tableWidget_2->setItem(i,6,new QTableWidgetItem(lStudents[i].stu_phone));ui->tableWidget_2->setItem(i,7,new QTableWidgetItem(lStudents[i].stu_wechat));}
}

此時(shí)我們的數(shù)據(jù)就刷新出來(lái)了:

接下來(lái)我們實(shí)現(xiàn)這幾個(gè)按鈕的功能:

先來(lái)實(shí)現(xiàn)增加按鈕的功能.創(chuàng)建一個(gè)dlg_addstu文件,dlg_addstu.ui如下:

?然后我們還有個(gè)修改操作,就不單獨(dú)設(shè)計(jì)UI界面,直接用dlg_addstu.ui的界面.

我們用一個(gè)全局變量m_isAdd,如果m_isAdd為True表示當(dāng)前是添加操作,為false表示當(dāng)前是修改操作.

dlg_addstu.ui界面的保存按鈕和取消按鈕定義如下:

增加操作是我們獲取一下每個(gè)輸入框輸入的內(nèi)容,把這些信息全部傳給變量info,然后再把Info作為參數(shù)傳給addStu()函數(shù)執(zhí)行insert SQL語(yǔ)句.

//保存
void Dlg_AddStu::on_btn_save_clicked()
{StuInfo info;   //把所有的字段讀取到info里auto ptr=stusql::getinstance();info.id=m_info.id; //傳idinfo.stu_name=ui->le_name->text();info.stu_age=ui->sb_age->text().toInt();info.stu_grade=ui->le_grade->text().toInt();info.stu_class=ui->le_class->text().toInt();info.stu_id=ui->le_id->text().toUInt();info.stu_phone=ui->le_phone->text();info.stu_wechat=ui->le_wechat->text();if(m_isAdd) //為true表示當(dāng)前是添加操作{ptr->addstu(info);}else{    //為false表示當(dāng)前是修改操作ptr->updateInfo(info);}QMessageBox::information(nullptr,"消息","添加成功");this->hide(); //點(diǎn)擊保存之后窗口消失
}


void Dlg_AddStu::setType(bool isAdd,StuInfo info)
{m_isAdd=isAdd;m_info=info; //把info的所有信息都給中間變量m_info,包括idui->le_name->setText(info.stu_name);ui->sb_age->setValue(info.stu_age);ui->le_grade->setText(QString::number(info.stu_grade));ui->le_class->setText(QString::number(info.stu_class));ui->le_phone->setText(QString(info.stu_phone));ui->le_wechat->setText(QString(info.stu_wechat));
}

取消按鈕?

//取消
void Dlg_AddStu::on_btn_cancel_clicked()
{this->hide();
}

添加按鈕(調(diào)出添加輸入框)

//點(diǎn)擊添加按鈕彈出添加界面
void MainWindow::on_btn_add_clicked()
{m_dlgAddstu.setType(true);  //表示true代表當(dāng)前是添加操作,false代表當(dāng)前是修改操作m_dlgAddstu.exec();  //模態(tài)對(duì)話框 當(dāng)前界面不操作完不能操作其他界面// m_dlgAddstu.show();  //非模態(tài)對(duì)話框updateTable();         //添加完成之后刷新一下界面
}

//刪除按鈕的定義如下
void MainWindow::on_btn_del_clicked()
{int i=ui->tableWidget_2->currentRow();                     //獲取一下鼠標(biāo)點(diǎn)擊的記錄(即需要?jiǎng)h除的記錄)if(i>=0)                                                   //如果要?jiǎng)h除的記錄是合法記錄 (即不是不存在的記錄),那么就進(jìn)行刪除{int id=ui->tableWidget_2->item(i,1)->text().toUInt();  //刪除需要通過id刪除,這里獲取idm_ptrStusql->delStu(id);                               //傳給我們定義的delStu()函數(shù)執(zhí)行刪除sql語(yǔ)句  updateTable();  //刪除完之后刷新一下界面QMessageBox::information(nullptr,"信息","刪除成功");}
}

查詢

//搜索
void MainWindow::on_btn_seacher_clicked()
{QString SearchFile=ui->lb_search->text();   //獲取搜索輸入框輸入的內(nèi)容//如果輸入框的內(nèi)容為空就退出查詢    if(SearchFile.isEmpty()){QMessageBox::information(nullptr,"信息","查詢?yōu)榭?");updateTable();return;}//必須要告訴編譯器有多少列才能顯示表頭ui->tableWidget_2->clear();ui->tableWidget_2->setColumnCount(9);QStringList l;//自定義表頭l<<"序號(hào)"<<"id"<<"姓名"<<"年齡"<<"年紀(jì)"<<"班級(jí)"<<"學(xué)號(hào)"<<"電話"<<"微信";ui->tableWidget_2->setHorizontalHeaderLabels(l); //設(shè)置顯示表頭ui->tableWidget_2->setSelectionBehavior(QAbstractItemView::SelectRows);  //當(dāng)用戶點(diǎn)擊任何一個(gè)單元格時(shí),整個(gè)行都會(huì)被選中//顯示數(shù)據(jù)內(nèi)容auto cnt=m_ptrStusql->getStuCnt();  //獲取記錄行數(shù)ui->lb_cnt->setText(QString("數(shù)量:%1").arg(cnt));  //顯示學(xué)生數(shù)量ui->tableWidget_2->setSelectionBehavior(QAbstractItemView::SelectRows);//單擊選中一行ui->tableWidget_2->setEditTriggers(QAbstractItemView::NoEditTriggers);//使記錄不可被直接編輯QList<StuInfo> lStudents=m_ptrStusql->getPageStu(0,cnt);  //獲取一共有多少頁(yè)數(shù)據(jù)int index=0;//將數(shù)據(jù)刷新到tablewidget上for(int i=0;i<lStudents.size();i++){//如果查詢不到這個(gè)人就不執(zhí)行下面的操作if(!lStudents[i].stu_name.contains(SearchFile)){continue;}index++;ui->tableWidget_2->setItem(i,0,new QTableWidgetItem(QString::number(index)));ui->tableWidget_2->setItem(i,1,new QTableWidgetItem(QString::number(lStudents[i].id)));ui->tableWidget_2->setItem(i,2,new QTableWidgetItem(lStudents[i].stu_name));ui->tableWidget_2->setItem(i,3,new QTableWidgetItem(QString::number(lStudents[i].stu_age)));ui->tableWidget_2->setItem(i,4,new QTableWidgetItem(QString::number(lStudents[i].stu_grade)));ui->tableWidget_2->setItem(i,5,new QTableWidgetItem(QString::number(lStudents[i].stu_class)));ui->tableWidget_2->setItem(i,6,new QTableWidgetItem(QString::number(lStudents[i].stu_id)));ui->tableWidget_2->setItem(i,7,new QTableWidgetItem(lStudents[i].stu_phone));ui->tableWidget_2->setItem(i,8,new QTableWidgetItem(lStudents[i].stu_wechat));}//最后統(tǒng)計(jì)一下查詢出來(lái)的人數(shù)ui->tableWidget_2->setRowCount(index);  //設(shè)置行數(shù)
}

?修改

//修改按鈕
void MainWindow::on_btn_modify_clicked()
{StuInfo info;                           //把當(dāng)前鼠標(biāo)點(diǎn)擊的記錄的每個(gè)字段添加到info里int i=ui->tableWidget_2->currentRow();  //獲取鼠標(biāo)點(diǎn)擊的行(即要修改的記錄)if(i>=0){info.id=ui->tableWidget_2->item(i,1)->text().toUInt();  //獲取id的值并保存在Info里info.stu_name=ui->tableWidget_2->item(i,2)->text();info.stu_age=ui->tableWidget_2->item(i,3)->text().toUInt();info.stu_grade=ui->tableWidget_2->item(i,4)->text().toUInt();info.stu_class=ui->tableWidget_2->item(i,5)->text().toUInt();info.stu_id=ui->tableWidget_2->item(i,6)->text().toUInt();info.stu_phone=ui->tableWidget_2->item(i,7)->text();info.stu_wechat=ui->tableWidget_2->item(i,8)->text();m_dlgAddstu.setType(false,info);m_dlgAddstu.exec();}updateTable();  //更新完之后把界面刷新一下
}

清空學(xué)生表

//清除學(xué)生表
void MainWindow::on_btn_StuClear_clicked()
{m_ptrStusql->clearStuInfo();updateTable();
}

優(yōu)化

優(yōu)化一下數(shù)據(jù)模擬的加載時(shí)間

也就是優(yōu)化一下add()函數(shù)

我們用QList<StuInfo> l來(lái)接收所有的添加信息,再通過循環(huán)從l里讀取每條記錄進(jìn)行,執(zhí)行添加sql語(yǔ)句,再把事務(wù)打開.

//添加學(xué)生
bool stusql::addstu(QList<StuInfo> l)
{QSqlQuery sql(m_db);m_db.transaction();  //開啟事務(wù)for(auto info:l){QString strsql = QString("INSERT INTO student VALUES (NULL, '%1', %2, %3, %4, %5, '%6', '%7')").arg(info.stu_name).arg(info.stu_age).arg(info.stu_grade).arg(info.stu_class).arg(info.stu_id).arg(info.stu_phone).arg(info.stu_wechat);if (!sql.exec(strsql)) {QMessageBox::critical(nullptr, tr("Database Error"),tr("Failed to insert data: %1").arg(sql.lastError().text()));return false; // 返回 false 表示插入失敗}}m_db.commit();return true; // 返回 true 表示插入成功
}

打包

樣式打包

把我們的皮膚樣式復(fù)制兩份到當(dāng)前目錄,分別重名為dlg.css,main.css:

?在dlg.css里只保留登錄界面的樣式,在main.css里只保留主界面的樣式

在資源文件里把我們的所有資源都載入:

然后在主界面初始化的時(shí)候把我們的皮膚加載上:

數(shù)據(jù)庫(kù)打包

?數(shù)據(jù)庫(kù)路徑問題.我們把1端口打開,用當(dāng)前目錄下的路徑,不要用絕對(duì)路徑:

然后我們以debug方式打包我們的exe文件,打開QT安裝目錄下bin目錄,在路徑欄里輸入"cmd",然后在dos窗戶輸入:"windeployqt.exe":

然后把我們的exe文件拖上去就開始打包了:

打包完成之后雙擊我們的exe文件發(fā)現(xiàn)運(yùn)行不了:

這是QT的一個(gè)bug,有幾個(gè)文件是不會(huì)打包的,需要我們手動(dòng)打包.我們?nèi)in目錄下找到三個(gè)lib開頭的文件,將其復(fù)制到打包好的exe文件同級(jí)目錄下:

?

http://www.risenshineclean.com/news/37249.html

相關(guān)文章:

  • 四川省建設(shè)信息網(wǎng)站百度推廣客戶端下載安裝
  • 微信小網(wǎng)站怎么做網(wǎng)站優(yōu)化平臺(tái)
  • 網(wǎng)絡(luò)建設(shè)網(wǎng)站有關(guān)知識(shí)湖北疫情最新消息
  • 軟裝設(shè)計(jì)師培訓(xùn)網(wǎng)站優(yōu)化建設(shè)
  • 中信建設(shè)內(nèi)部網(wǎng)站免費(fèi)ip地址代理
  • 怎么做水果機(jī)網(wǎng)站開發(fā)一個(gè)小程序一般需要多少錢呢
  • java cms做網(wǎng)站刷關(guān)鍵詞排名seo軟件軟件
  • 類似于wordpress的網(wǎng)站濟(jì)南百度競(jìng)價(jià)
  • 遼寧省建設(shè)工程造價(jià)管理網(wǎng)站如何設(shè)計(jì)一個(gè)網(wǎng)站頁(yè)面
  • 移動(dòng)網(wǎng)站性能網(wǎng)絡(luò)廣告營(yíng)銷的特點(diǎn)
  • 網(wǎng)站里可以添加視頻做背景嗎競(jìng)價(jià)點(diǎn)擊軟件工具
  • 進(jìn)口食品銷售銷售在那個(gè)網(wǎng)站做世界搜索引擎公司排名
  • 必應(yīng)網(wǎng)站收錄在哪在線種子資源庫(kù)
  • 做網(wǎng)站哪個(gè)服務(wù)器好一套完整的運(yùn)營(yíng)方案
  • 學(xué)校網(wǎng)站設(shè)計(jì)實(shí)驗(yàn)報(bào)告seo個(gè)人優(yōu)化方案案例
  • 品牌規(guī)劃外貿(mào)網(wǎng)站推廣與優(yōu)化
  • wordpress 推薦 配置寧波核心關(guān)鍵詞seo收費(fèi)
  • 可以做打賞視頻的網(wǎng)站全網(wǎng)引擎搜索
  • 高端網(wǎng)站定制建站企業(yè)培訓(xùn)課程ppt
  • 網(wǎng)站設(shè)計(jì)怎么做一點(diǎn)首頁(yè)就跳轉(zhuǎn)seo是什么意思蜘蛛屯
  • 網(wǎng)站建設(shè)是什么科目今日的新聞?lì)^條10條
  • 北京大興網(wǎng)站建設(shè)公司咨詢產(chǎn)品關(guān)鍵詞
  • 萬(wàn)州哪里有做網(wǎng)站的關(guān)鍵詞排名查詢工具
  • 自己做網(wǎng)站怎么修改語(yǔ)言營(yíng)銷策略案例
  • 個(gè)人網(wǎng)站論文摘要網(wǎng)頁(yè)設(shè)計(jì)與制作期末作品
  • wordpress調(diào)用網(wǎng)站標(biāo)題愛站網(wǎng)長(zhǎng)尾關(guān)鍵詞搜索
  • 做網(wǎng)站公司哪家好百度競(jìng)價(jià)開戶多少錢
  • 貴州住房和城鄉(xiāng)建設(shè)廳舊網(wǎng)站不受國(guó)內(nèi)限制的搜索引擎
  • 石家莊seo網(wǎng)站優(yōu)化價(jià)格seo網(wǎng)站優(yōu)化推廣費(fèi)用
  • 肥西縣市建設(shè)局網(wǎng)站廣州seo公司如何