一,mysql和Qt做的基站系统
Linux 中函数 -》tcgettr函数得到当前终端
这个项目的精华在界面间专递数据显示 使用QStandardItemModel一个二级指针
1,在mymysql.h的头文件中声明
int sql_open(const char *SQL, QStandardItemModel **p);
2,mymysql.cc文件使用
*p = new QStandardItemModel(rowcount, filecount); //数据Model
3,mainwindow.cc文件中使用
*/
void MainWindow::script_msg(const char *SQL)
{
int res = 0;
// 判断执行那个函数
if (strncmp(SQL, "SELECT", 6) ==0)
{
QStandardItemModel *model = NULL;
res = db.sql_open(SQL, &model); //如果是SELECT,那么执行sql_open这个函数
QTableView *view1 = new QTableView;
view1->setAttribute(Qt::WA_DeleteOnClose); //代表关闭自动这个widget的时候 自动这个webget 释放
mdiArea->addSubWindow(view1);
view1->setStyleSheet("border-image: url(3.jpg);"); //设置widget背景图片
view1->setModel(model);
view1->show();
mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);
}
else{
res = db.sql_exec(SQL);
}
if (res == -1)
{
QMessageBox::information(this,"exec 执行失败", db.geterror());
}else
{
QMessageBox::information(this,"exec 执行成功", db.geterror());
}
}
2,下面是完整的代码
1.logindlg.h头文件
#ifndef LOGINDLG_H
#define LOGINDLG_H
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
class loginDlg : public QDialog
{
Q_OBJECT
public:
explicit loginDlg(QWidget *parent = 0);
signals:
public slots:
private:
QLabel *lable0, *lable1, *lable2, *lable3;
//输入框
QLineEdit *lineEditUserID, *lineEditPassWd, *lineEditDbName, *lineEditHostIP;
QPushButton *loginBtn, *logoutBtn;
private slots:
void loginBtnOnclick();
void logoutBtnOnclick();
public:
QString userid;
QString passwd;
QString dbname;
QString hostip;
bool islogin;
};
#endif // LOGINDLG_H
2,logindlg.cc实现
#include "logindlg.h"
#include <QDialog>
#include <QGridLayout>
#include <QPalette>
#include <QMessageBox>
loginDlg::loginDlg(QWidget *parent) :
QDialog(parent)
{
islogin = false;
//文本
lable0 = new QLabel;
lable0->setText(tr("用户名"));
lable1 = new QLabel;
lable1->setText(tr("密码"));
lable2 = new QLabel;
lable2->setText(tr("数据库名称"));
lable3 = new QLabel;
lable3->setText(tr("服务器IP"));
//输入框
lineEditUserID = new QLineEdit;
lineEditPassWd = new QLineEdit;
lineEditPassWd->setEchoMode(QLineEdit::Password); //设置为密码框
lineEditDbName = new QLineEdit;
lineEditHostIP = new QLineEdit;
loginBtn = new QPushButton;
logoutBtn = new QPushButton;
loginBtn->setText("登录");
logoutBtn->setText("取消");
QGridLayout *layout = new QGridLayout(this);
layout->addWidget(lable0, 0, 0);
layout->addWidget(lineEditUserID, 0, 1);
layout->addWidget(lable1, 1, 0);
layout->addWidget(lineEditPassWd, 1, 1);
layout->addWidget(lable2, 2, 0);
layout->addWidget(lineEditDbName, 2, 1);
layout->addWidget(lable3, 3, 0);
layout->addWidget(lineEditHostIP, 3, 1);
layout->addWidget(loginBtn, 4, 0);
layout->addWidget(logoutBtn, 4, 1);
//设置列
/**
-------------------
| |
| |
| |
| |
|___________________|
*/
layout->setColumnStretch(0, 1);
layout->setColumnStretch(1, 1);
//设置layout边框
layout->setMargin(15);
layout->setSpacing(10); //设置layout控件间
//设置对话框大小不可改变
layout->setSizeConstraint(QLayout::SetFixedSize); //设置对话框大小不可改变
setWindowTitle("登录");
//设置背景图片
this->setAutoFillBackground(true);
QPalette palette;
//图片的
palette.setBrush(QPalette::Background, QBrush(QPixmap("2.jpg")));
setPalette(palette);
connect(loginBtn, SIGNAL(clicked()), this, SLOT(loginBtnOnclick()));
connect(logoutBtn, SIGNAL(clicked()), this, SLOT(logoutBtnOnclick()));
}
void loginDlg::loginBtnOnclick()
{
userid = lineEditUserID->text();
passwd = lineEditPassWd->text();
dbname = lineEditDbName->text();
hostip = lineEditHostIP->text();
islogin = true;
close();
}
void loginDlg::logoutBtnOnclick()
{
close();
}
3,mymysql.h头文件
#ifndef MYMYSQL_H
#define MYMYSQL_H
#include <QStandardItemModel>
//window下的aip
#include <windows.h>
#include <C:/mysql/include/mysql.h>
//linux mysql
//#include <mysql/mysql.h>
/**
* 创建这个类的目的是实现封装,封装sql
* @brief The mymysql class
*/
class mymysql
{
public:
mymysql();
~mymysql();
//错误sql信息
const char *geterror();
//serverIP地址, 用户名,密码,
int sql_connect(const char *Hostname, const char *User, const char *password, const char *DBName);
void sql_disconnet();
int sql_exec(const char *SQL);
int sql_open(const char *SQL, QStandardItemModel **p);
private:
MYSQL *connection;
MYSQL mysql;
char buf[1024]; //error 信息
};
#endif // MYMYSQL_H
4,mymysql.cc文件
#include "mymysql.h"
#include <QMessageBox>
#include <windows.h>
#include <C:/mysql/include/mysql.h>
#include <string.h>
/**
*封装mysql数据库 所有sql处理
* @brief mymysql::mymysql
*/
mymysql::mymysql()
{
mysql_init(&mysql); //mysql数据库初始化
connection = NULL;
memset(buf, 0, sizeof(buf));
}
mymysql::~mymysql()
{
}
/**
*错误的信息
* @brief mymysql::geterror
* @return
*/
const char *mymysql::geterror()
{
return buf;
}
/**
* 链接mysql数据
* @brief mymysql::sql_connect
* @param Hostname
* @param User
* @param password
* @param DBName
* @return
*/
int mymysql::sql_connect(const char *Hostname, const char *User, const char *password, const char *DBName)
{
connection = mysql_real_connect(&mysql, Hostname, User, password, DBName, 0, 0, 0);
if (connection == NULL)
{
//清空buf
memset(buf, 0, sizeof(buf));
strcpy(buf, mysql_error(&mysql));
QMessageBox::information(0 , "", mysql_error(&mysql));
return -1;
}
else
{
return 0;
}
}
/**
* 判断链接
* @brief mymysql::sql_disconnet
*/
void mymysql::sql_disconnet()
{
if (connection)
{
mysql_close(connection);
connection = NULL;
}
}
/**
* 查询语句
* @brief mymysql::sql_exec
* @param SQL
*/
int mymysql::sql_exec(const char *SQL)
{
if (mysql_query(connection, SQL) != 0)
{
//清空buf
memset(buf, 0, sizeof(buf));
strcpy(buf, mysql_error(&mysql));
return -1;
}
else
{
//设置编码格式
mysql_query(connection, "set names utf8");
return 0;
}
}
/**
* 数据库查询
* @brief mymysql::sql_open
* @param SQL
* @return
*/
int mymysql::sql_open(const char *SQL, QStandardItemModel **p)
{
if (mysql_query(connection, SQL) != 0)
{
//清空buf
memset(buf, 0, sizeof(buf));
strcpy(buf, mysql_error(&mysql));
return -1;
}
else
{
//设置编码格式
mysql_query(connection, "set names utf8");
MYSQL_RES *result = mysql_store_result(connection);
if (result == NULL)
{
//没有查询结果
//清空buf
memset(buf, 0, sizeof(buf));
strcpy(buf, mysql_error(&mysql));
return -1;
}
//mysql 提供一个函数
int rowcount = mysql_affected_rows(connection); //多少行
int filecount = mysql_field_count(connection); //这个函数SQL语句有的多少列
MYSQL_FIELD *field;
*p = new QStandardItemModel(rowcount, filecount); //数据Model
int i = 0;
int j = 0;
for (i = 0; i < filecount; i++)
{
field = mysql_fetch_field(result);
//if (field == NULL) //如果读到最后循环退出
//{
break;
//}
//QMessageBox::information(0, "",field->name);
(*p)->setHeaderData(i, Qt::Horizontal, field->name);
}
for(i = 0; i < rowcount; i++) //得到循环遍历每一行
{
MYSQL_ROW row = mysql_fetch_row(result);
for(j = 0; j < filecount; j++)
{
// QMessageBox::information(0, "",row[j]);
(*p)->setData((*p)->index(i, j, QModelIndex()), row[j]); //数据
}
}
mysql_free_result(result);//释放mysql_stre_resut内存
return 0;
}
}
5,scriptdlg.h头文件
#ifndef SCRIPTDLG_H
#define SCRIPTDLG_H
#include <QDialog>
#include <QLabel>
#include <QTextEdit>
#include <QPushButton>
class scriptDlg : public QDialog
{
Q_OBJECT
public:
explicit scriptDlg(QWidget *parent = 0);
QString SQL; //sql 查询语句
bool islogin;
signals:
public slots:
void okBtnOnclick();
void cancelBtnOnclick();
private:
QLabel *label0;
QTextEdit *textEditSQL;
QPushButton *okBtn;
QPushButton *cancelBtn;
};
#endif // SCRIPTDLG_H
6,scriptdlg.cc 文件
#include "scriptdlg.h"
#include <QGridLayout>
#include <QHBoxLayout>
scriptDlg::scriptDlg(QWidget *parent) :
QDialog(parent)
{
islogin = false;
label0 = new QLabel;
label0->setText("请输入SQL");
textEditSQL = new QTextEdit;
okBtn = new QPushButton;
okBtn->setText("执行");
cancelBtn = new QPushButton;
cancelBtn->setText("取消");
QGridLayout *layout1 = new QGridLayout(this);
layout1->addWidget(label0, 0, 0);
layout1->addWidget(textEditSQL,0, 1);
QHBoxLayout *layout2 = new QHBoxLayout; //这个layout是要放到第一的layout中
layout2->addWidget(okBtn);
layout2->addWidget(cancelBtn);
layout1->addLayout(layout2, 1, 1);
connect(okBtn, SIGNAL(clicked()), this, SLOT(okBtnOnclick()) );
connect(cancelBtn, SIGNAL(clicked()), this, SLOT(cancelBtnOnclick()));
}
/**
* sql 是否查询按
* @brief scriptDlg::okBtnOnclick
*/
void scriptDlg::okBtnOnclick()
{
//TextEdit得到用户输入的字符
SQL = textEditSQL->toPlainText(); //没有的
islogin = true;
close();
}
void scriptDlg::cancelBtnOnclick()
{
close();
}
7,mainwindow.h头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMenu> //菜单
#include <QMenuBar> //事件
#include <QAction> //
#include <QMdiArea>
#include "mymysql.h"
#include <QCloseEvent>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
//是否退出
void closeEvent(QCloseEvent *event);
private:
mymysql db;
//view
void showview();
//显示一个子窗口
void showsub();
//
void createMenus();
//
void createAction();
//四个菜单
QMenu *adminMenu;
QMenu *dataMenu; //数据
QMenu *windowMenu;
QMenu *helpMenu;
QAction *loginAction;
QAction *logoutAction;
QAction *exitAction; //退出
QAction *scriptAction;
QAction *cascadeAction;
QAction *tileAction;
QAction *helpAction;
QAction *aboutAction;
//主界面背景
QMdiArea *mdiArea;
private slots:
void on_login();
void on_logout();
void on_exit();
void on_script();
void on_help();
void on_about();
void script_msg(const char *SQL);
void cascadeSubWindow();
void tileSubWindows();
};
#endif // MAINWINDOW_H
8,mainwindow.cc 文件
#include "mainwindow.h"
#include <QMenu> //菜单
#include <QMenuBar> //事件
#include <QAction> //
#include <QMdiSubWindow>
#include "logindlg.h"
#include <QIcon>
#include <QStandardItemModel>
#include <QTableView>
#include "scriptdlg.h"
#include "mymysql.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setWindowTitle("CDMA无线基站管理系统");
setWindowIcon(QIcon("main.png"));
//主界面的设置
mdiArea = new QMdiArea;
setCentralWidget(mdiArea);
//设置背景
mdiArea->setBackground(Qt::NoBrush);
mdiArea->setStyleSheet("background-image: url(1.jpg);"); //背景设置
//mdiArea->setStyleSheet("border-image: url(1.jpg)");
//当子窗口的范围父推动
mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
//添加登录按键
createAction();
//调用
createMenus();
//改变文件的主窗口大小main函数中的改
}
MainWindow::~MainWindow()
{
}
/**
*是否退出 closeEvent 函数是在widget退出之前被调用的
* @brief MainWindow::CloseEvent
* @param event
*/
void MainWindow::closeEvent(QCloseEvent *event)
{
//通过question返回值得
QMessageBox::StandardButton button ;
button = QMessageBox::question(this, "提示", "是否退出程序", QMessageBox::Yes | QMessageBox::No);
if (button == QMessageBox::Yes)
{
//接受退出
event->accept();
}
else
{
//不接受退出
event->ignore();
}
/*
event->accept(); //接受退出
event->ignore(); //不接受退出
QMessageBox::information(this, "","QCloseEvent" );*/
}
/**
*显示数据
* @brief MainWindow::showview
*/
void MainWindow::showview()
{
QStandardItemModel *model = new QStandardItemModel(5, 3);
// 行的表头
model->setHeaderData(0, Qt::Horizontal, "姓名");
model->setHeaderData(1, Qt::Horizontal, "性别");
model->setHeaderData(2, Qt::Horizontal, "年龄");
//显示数据的model
model->setData(model->index(0, 0, QModelIndex()), "张三");
model->setData(model->index(0, 1, QModelIndex()), "男");
model->setData(model->index(0, 2, QModelIndex()), "22");
model->setData(model->index(1, 0, QModelIndex()), "王蓉");
model->setData(model->index(1, 1, QModelIndex()), "女");
model->setData(model->index(1, 2, QModelIndex()), "22");
model->setData(model->index(2, 0, QModelIndex()), "陈丽");
model->setData(model->index(2, 1, QModelIndex()), "女");
model->setData(model->index(2, 2, QModelIndex()), "22");
QTableView *view1 = new QTableView;
view1->setAttribute(Qt::WA_DeleteOnClose); //代表关闭自动这个widget的时候 自动这个webget 释放
mdiArea->addSubWindow(view1);
view1->setStyleSheet("border-image: url(3.jpg);"); //设置widget背景图片
view1->setModel(model);
view1->show();
mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);
}
/**
* 子窗口
* @brief MainWindow::showsub
*/
void MainWindow::showsub()
{
QWidget *w = new QWidget;
w->setAttribute(Qt::WA_DeleteOnClose); //代表关闭自动这个widget的时候 自动这个webget 释放
mdiArea->addSubWindow(w);
w->setWindowTitle("SDDFDJKF");
w->setStyleSheet("border-image: url(3.jpg);"); //设置widget背景图片
w->show();
//mdiArea->activeSubWindow()->resize(width() - 100, height() - 100); // 设置widget窗口大小
mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);
}
/**
* 添加菜单
* @brief createMenus
*/
void MainWindow::createMenus()
{
adminMenu = this->menuBar()->addMenu(tr("管理"));
//添加登录
adminMenu->addAction(loginAction);
//添加注销
adminMenu->addAction(logoutAction);
//添加分隔符
adminMenu->addSeparator();
//退出
adminMenu->addAction(exitAction);
dataMenu = this->menuBar()->addMenu(tr("数据"));
dataMenu->addAction(scriptAction);
windowMenu = this->menuBar()->addMenu(tr("窗口"));
windowMenu->addAction(cascadeAction);
//添加分隔符
windowMenu->addSeparator();
windowMenu->addAction(tileAction);
//菜单
helpMenu = this->menuBar()->addMenu(tr("帮助"));
helpMenu->addAction(helpAction);
helpMenu->addSeparator();
helpMenu->addAction(aboutAction);
}
/**
*登录菜单
* @brief MainWindow::createAction
*/
void MainWindow::createAction()
{
//登录菜单 快捷键 Ctrl+u
loginAction = new QAction(tr("登录"), this);
loginAction->setShortcut(tr("Ctrl+u"));
//关联
connect(loginAction, SIGNAL(triggered()), this, SLOT(on_login()));
//注销 快捷键 Ctrl+b
logoutAction = new QAction(tr("注销"), this);
logoutAction->setShortcut(tr("Ctrl+b"));
//关联
connect(logoutAction, SIGNAL(triggered()), this, SLOT(on_logout()));
//退出 快捷键 Ctrl+w
exitAction = new QAction(tr("退出"), this);
exitAction->setShortcut(tr("Ctrl+w"));
//关联
connect(exitAction, SIGNAL(triggered()), this, SLOT(on_exit()));
scriptAction = new QAction(tr("执行脚本"), this);
scriptAction->setShortcut(tr("Ctrl+p"));
scriptAction->setEnabled(false); //设置不好好用
connect(scriptAction, SIGNAL(triggered()), this, SLOT(on_script()));
//窗口
cascadeAction = new QAction(tr("层叠"), this);
cascadeAction->setShortcut(tr("Ctrl+Q"));
connect(cascadeAction, SIGNAL(triggered()), this, SLOT(cascadeSubWindow()));
tileAction = new QAction(tr("并列"), this);
tileAction->setShortcut(tr("Ctrl+R"));
connect(tileAction, SIGNAL(triggered()), this, SLOT(tileSubWindows()));
//帮助
helpAction = new QAction(tr("帮助"), this);
helpAction->setShortcut(tr("Ctrl+s"));
connect(helpAction, SIGNAL(triggered()), this, SLOT(on_help()));
aboutAction = new QAction(tr("关于"), this);
aboutAction->setShortcut(tr("Ctrl+T"));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(on_about()));
}
/**
* login
* @brief MainWindow::on_login
*/
void MainWindow::on_login()
{
loginDlg dlg; //将对话实例化
dlg.exec(); // 模式对话框
//QMessageBox::information(this, "", "hello World!!!!!!");
//链接服务器和拿到mysql用户名和密码等信息判断
int res = db.sql_connect(dlg.hostip.toStdString().data(),
dlg.userid.toStdString().data(),
dlg.passwd.toStdString().data(),
dlg.dbname.toStdString().data());
if (res == -1)
{
QMessageBox::information(this, "登录失败", db.geterror());
}
else
{
QMessageBox::information(this, "登录成功", db.geterror());
scriptAction->setEnabled(true); //设置可以用
}
/*
if (dlg.islogin)
{
if (dlg.userid == "chensong" && dlg.passwd == "123456")
{
QMessageBox::information(this, "", "登录成功!!!");
}
else
{
QMessageBox::information(this, "", "登录失败!!");
}
}
*/
}
/**
* 注销
* @brief MainWindow::on_logout
*/
void MainWindow::on_logout()
{
//通过question返回值得
QMessageBox::StandardButton button ;
button = QMessageBox::question(this, "提示", "是否注销程序",
QMessageBox::Yes | QMessageBox::No);
if (button == QMessageBox::Yes)
{
db.sql_disconnet();
scriptAction->setDisabled(false);
}
QMessageBox::information(this, "","注销" );
}
/**
*退出
* @brief MainWindow::on_exit
*/
void MainWindow::on_exit()
{
close();
}
/**
* 执行脚本
* @brief MainWindow::on_script
*/
void MainWindow::on_script()
{
/*
if ( db.sql_exec("delete from table3 where where teacher = '老师'") == -1)
{
QMessageBox::information(this,"exec 执行失败", db.geterror());
}
else
{
QMessageBox::information(this,"exec 执行成功", db.geterror());
}*/
scriptDlg dlg;
dlg.exec();
// 判断是否成功输入的
if (dlg.islogin)
{
script_msg(dlg.SQL.toStdString().data());
}
//showview();
}
void MainWindow::on_help()
{
QMessageBox::information(this, "帮助", "自学C/C++");
}
void MainWindow::on_about()
{
QMessageBox::about(this, "关于", "版权所有, 盗版@@@@");
}
/**
*
* @brief MainWindow::script_msg
* @param SQL
*/
void MainWindow::script_msg(const char *SQL)
{
int res = 0;
// 判断执行那个函数
if (strncmp(SQL, "SELECT", 6) ==0)
{
QStandardItemModel *model = NULL;
res = db.sql_open(SQL, &model); //如果是SELECT,那么执行sql_open这个函数
QTableView *view1 = new QTableView;
view1->setAttribute(Qt::WA_DeleteOnClose); //代表关闭自动这个widget的时候 自动这个webget 释放
mdiArea->addSubWindow(view1);
view1->setStyleSheet("border-image: url(3.jpg);"); //设置widget背景图片
view1->setModel(model);
view1->show();
mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);
}
else{
res = db.sql_exec(SQL);
}
if (res == -1)
{
QMessageBox::information(this,"exec 执行失败", db.geterror());
}else
{
QMessageBox::information(this,"exec 执行成功", db.geterror());
}
}
/**
*层叠子窗口
* @brief MainWindow::cascadeSubWindow
*/
void MainWindow::cascadeSubWindow()
{
mdiArea->cascadeSubWindows();
}
/**
*并列子窗口
* @brief MainWindow::tileSubWindows
*/
void MainWindow::tileSubWindows()
{
mdiArea->tileSubWindows();
}
main.cc文件
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
//改变窗口的大小
w.resize(700, 500);
w.show();
return a.exec();
}