QT 数据库编程三
//mainwindow.cpp
#include "mainwindow.h"
#include "logindlg.h"
#include "scriptdlg.h" #include <QMessageBox>
#include <QIcon>
#include <QMdiSubWindow> #include <QStandardItemModel>
#include <QTableView> MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/*设置窗口标题*/
this->setWindowTitle(tr("CDMA无线基站管理系统"));
/*设置窗口光标(窗口左上角图片)*/
this->setWindowIcon(QIcon("main.png")); /*QMdiArea控件只能在MainWindow控件中使用,是用来实现多文档界面的必备控件*/
mdiarea1=new QMdiArea();
/*设置QMdiArea控件的背景图片*/
mdiarea1->setBackground(Qt::NoBrush);
/*背景图片设置为11.jpg,子窗口大小可以调整*/
mdiarea1->setStyleSheet("background-image:url(10.jpg)");
/*当子窗口的范围超过父窗口的显示范围时,设置自动具有横向滚动条*/
mdiarea1->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
/*设置自动具有纵向滚动条*/
mdiarea1->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
this->setCentralWidget(mdiarea1);
/*初始化基本控件*/
initmenubar(); /*初始化数据库连接*/
sqlhelper=new Vmysql();
} //初始化控件
void MainWindow::initmenubar()
{
/*管理菜单*/
menu1=this->menuBar()->addMenu(tr("管理"));
login_in=new QAction(tr("登录"),this);
login_in->setShortcut(tr("Ctrl+U"));
connect(login_in,SIGNAL(triggered()),this,SLOT(login_inclick()));
login_out=new QAction(tr("注销"),this);
login_out->setShortcut(tr("Ctrl+B"));
connect(login_out,SIGNAL(triggered()),this,SLOT(login_outclick()));
quit1=new QAction(tr("退出"),this);
quit1->setShortcut(tr("Ctrl+W"));
connect(quit1,SIGNAL(triggered()),this,SLOT(quit_click()));
menu1->addAction(login_in);
menu1->addAction(login_out);
/*加入空格*/
menu1->addSeparator();
menu1->addAction(quit1); /*数据菜单*/
menu2=this->menuBar()->addMenu(tr("数据")); addstation=new QAction(tr("添加基站"),this);
addstation->setShortcut(tr("Ctrl+D"));\
//addstation->setEnabled(false);
connect(addstation,SIGNAL(triggered()),this,SLOT(add_station())); addstationcontrl=new QAction(tr("添加基站控制器"),this);
addstationcontrl->setShortcut(tr("Ctrl+E"));
connect(addstationcontrl,SIGNAL(triggered()),this,SLOT(add_stationcontrl())); addMSC=new QAction(tr("添加MSC"),this);
addMSC->setShortcut(tr("Ctrl+F"));
connect(addMSC,SIGNAL(triggered()),this,SLOT(add_MSC())); delstation=new QAction(tr("删除基站"),this);
delstation->setShortcut(tr("Ctrl+G"));
connect(delstation,SIGNAL(triggered()),this,SLOT(del_station())); delstationcontrl=new QAction(tr("删除基站控制器"),this);
delstationcontrl->setShortcut(tr("Ctrl+H"));
connect(delstationcontrl,SIGNAL(triggered()),this,SLOT(del_stationcontrl())); delMSC=new QAction(tr("删除MSC"),this);
delMSC->setShortcut(tr("Ctrl+I"));
connect(delMSC,SIGNAL(triggered()),this,SLOT(del_MSC())); sestation=new QAction(tr("查询基站"),this);
sestation->setShortcut(tr("Ctrl+J"));
connect(sestation,SIGNAL(triggered()),this,SLOT(sel_station())); sestationcontrl=new QAction(tr("查询基站控制器"),this);
sestationcontrl->setShortcut(tr("Ctrl+K"));
connect(sestationcontrl,SIGNAL(triggered()),this,SLOT(sel_stationcontrl())); seMSC=new QAction(tr("查询MSC"),this);
seMSC->setShortcut(tr("Ctrl+L"));
connect(seMSC,SIGNAL(triggered()),this,SLOT(sel_MSC())); upstation=new QAction(tr("修改基站"),this);
upstation->setShortcut(tr("Ctrl+M"));
connect(upstation,SIGNAL(triggered()),this,SLOT(update_station())); upstationcontrl=new QAction(tr("修改基站控制器"),this);
upstationcontrl->setShortcut(tr("Ctrl+N"));
connect(upstationcontrl,SIGNAL(triggered()),this,SLOT(update_stationcontrl())); upMSC=new QAction(tr("修改MSC"),this);
upMSC->setShortcut(tr("Ctrl+O"));
connect(upMSC,SIGNAL(triggered()),this,SLOT(update_MSC())); exscript=new QAction(tr("执行脚本"),this);
exscript->setShortcut(tr("Ctrl+P"));
connect(exscript,SIGNAL(triggered()),this,SLOT(exec_script())); menu2->addAction(addstation);
menu2->addAction(addstationcontrl);
menu2->addAction(addMSC);
menu2->addAction(delstation);
menu2->addAction(delstationcontrl);
menu2->addAction(delMSC);
menu2->addAction(sestation);
menu2->addAction(sestationcontrl);
menu2->addAction(seMSC);
menu2->addAction(upstation);
menu2->addAction(upstationcontrl);
menu2->addAction(upMSC);
menu2->addAction(exscript); /*窗口菜单*/
menu3=this->menuBar()->addMenu(tr("窗口")); cascade1=new QAction(tr("层叠窗口"),this);
cascade1->setShortcut(tr("Ctrl+Q"));
connect(cascade1,SIGNAL(triggered()),this,SLOT(cascade_window())); parallel=new QAction(tr("并列窗口"),this);
parallel->setShortcut(tr("Ctrl+R"));
connect(parallel,SIGNAL(triggered()),this,SLOT(parallel_window())); menu3->addAction(cascade1);
menu3->addAction(parallel); /*帮助菜单*/
menu4=this->menuBar()->addMenu(tr("帮助")); helper=new QAction(tr("帮助"),this);
helper->setShortcut(tr("Ctrl+s"));
connect(helper,SIGNAL(triggered()),this,SLOT(helper_click())); mabout=new QAction(tr("关于"),this);
mabout->setShortcut(tr("Ctrl+T"));
connect(mabout,SIGNAL(triggered()),this,SLOT(mabout_click())); menu4->addAction(helper);
menu4->addSeparator();
menu4->addAction(mabout); /*未登录,禁用所有按钮*/
close_action(); } /*登录*/
void MainWindow::login_inclick()
{
loginDlg logd1;
/*exec()方法会产生一个模式对话框,show()方法只会产生普通的对话框*/
logd1.exec();
/*
* 当模式对话框打开时,主窗口是不能接受输入输出的;
* 当非模式对话框打开时, 主窗口可以接受输入输出
* ----------------------------------
* 模式对话框与非模式对话框的重大区别:
* exec()函数会阻塞当前进程,
* 但是show()不会阻塞当前进程,会使login_inclick()函数直接执行完毕,
* logd1是一个局部变量,login_inclick()函数执行完毕,会导致logd1的内存被释放,
* 从而导致界面上对话框也随着消失,所以用show()看不到结果,
* 但是可以通过将logd1变量定义在堆内存上,避免这种情况,
* 但是这也会导致用户可以打开多个登陆对话框*/
//logd1.show();
if(!logd1.islogin)
{
/*判断用户是否点击了取消按钮*/
return;
}
if(logd1.username.isEmpty())
{
QMessageBox::critical(this,"错误信息","用户名不可以为空!");
return;
}
if(logd1.userpass.isEmpty())
{
QMessageBox::critical(this,"错误信息","密码不可以为空!");
return;
}
if(logd1.dbname.isEmpty())
{
QMessageBox::critical(this,"错误信息","数据库名称不可以为空!");
return;
}
if(logd1.ipaddr.isEmpty())
{
QMessageBox::critical(this,"错误信息","IP地址不可以为空!");
return;
}
/*连接数据库*/
int res=sqlhelper->sql_connect(logd1.ipaddr.toStdString().data()
,logd1.username.toStdString().data()
,logd1.userpass.toStdString().data()
,logd1.dbname.toStdString().data());
if(res<)
{
QMessageBox::critical(this,"错误信息",sqlhelper->ger_error());
}else
{
QMessageBox::information(this,"提示信息","登录成功");
/*开启所有SQL按钮*/
open_action();
}
} //注销
void MainWindow::login_outclick()
{
if(QMessageBox::question(this,"确认退出","您确定要注销吗?",QMessageBox::Ok|QMessageBox::No,QMessageBox::Ok)==QMessageBox::Yes)
{
//断开数据库连接
sqlhelper->sql_disconnect();
/*禁用所有按钮*/
close_action();
}
} //退出
void MainWindow::quit_click()
{
this->close();
} /*添加基站*/
void MainWindow::add_station()
{
//
} /*添加基站控制器*/
void MainWindow::add_stationcontrl()
{
//
} /*添加MSC*/
void MainWindow::add_MSC()
{
//
} /*删除基站*/
void MainWindow::del_station()
{
//
} /*删除基站控制器*/
void MainWindow::del_stationcontrl()
{
//
} /*删除MSC*/
void MainWindow::del_MSC()
{
//
} /*查询基站*/
void MainWindow::sel_station()
{
//
} /*查询基站控制器*/
void MainWindow::sel_stationcontrl()
{
//
} /*查询MSC*/
void MainWindow::sel_MSC()
{
//
} /*修改基站*/
void MainWindow::update_station()
{
//
} /*修改基站控制器*/
void MainWindow::update_stationcontrl()
{
//
} /*修改MSC*/
void MainWindow::update_MSC()
{
//
} /*执行脚本*/
void MainWindow::exec_script()
{
ScriptDlg w1;
w1.exec();
if(!w1.isexec) return;
exec_query(w1.strsql.toStdString().data());
} /*执行SQL查询*/
void MainWindow::exec_query(const char *strsql)
{
if(!judge_sqltype(strsql))
{
//执行SQL更新
if(sqlhelper->sql_exec(strsql)<)
{
QMessageBox::critical(this,"错误提示",sqlhelper->ger_error());
}
}else
{
//执行SQL查询
QStandardItemModel *model=NULL;
if(sqlhelper->sql_query(strsql,&model)<)
{
QMessageBox::critical(this,"错误提示",sqlhelper->ger_error());
return;
}
if(model==NULL)
{
QMessageBox::critical(this,"错误提示","model 为空!");
return;
}
/*创建view*/
display_view("查询结果",model);
}
} /*判断SQL操作的类型*/
bool MainWindow::judge_sqltype(const char *strsql)
{
bool flag=true;
//1.判断SQL执行的是查询还是更新
char tempbuf[]={};
/*遍历字符数据,将第一个空格前的所有字符转化成大写*/
for(int i=;i<(int)strlen(strsql);i++)
{
if(strsql[i]!=' ')
{
if(strsql[i]>&&strsql[i]<)
{
//小写转化成大写
tempbuf[i]=strsql[i]-;
}else
{
tempbuf[i]=strsql[i];
}
}else
{
break;
}
}
if(strncmp(tempbuf,"SET",)==)
{
flag=false;
}else if(strncmp(tempbuf,"INSERT",)==)
{
flag=false;
}else if(strncmp(tempbuf,"DELETE",)==)
{
flag=false;
}else if(strncmp(tempbuf,"UPDATE",)==)
{
flag=false;
}else if(strncmp(tempbuf,"USE",)==)
{
flag=false;
}
return flag;
} /*创建显示view*/
void MainWindow::display_view(const char *actionname,QStandardItemModel *model)
{
/*在QT中,model中存放数据,view中显示数据*/
/*定义view,QTableView继承于QWidget,QTableView在被销毁的同时,会自动销毁对应的model*/
QTableView *view1=new QTableView();
/*代表关闭这个widget的时候,自动将这个widget delete*/
view1->setAttribute(Qt::WA_DeleteOnClose);
/*多文档控件QMdiArea通过addSubWindow()将一个widget变成一个子窗口*/
mdiarea1->addSubWindow(view1);
view1->setWindowTitle(actionname);
/*设置背景图片*/
view1->setStyleSheet("background-image:url(11.jpg)"); /*view1继承于QWidget,如果没有model,那么view不会显示数据*/
view1->setModel(model);
view1->show();
/*必须在show()方法之后使用activeSubWindow()获取在最前面的子窗口*/
/*多文档中的子窗口widget设置大小,用resize()方法没有效果*/
//w1->resize(300,200);
/*QMdiArea控件通过activeSubWindow()方法得到当前活动窗口(最前边的子窗口)*/
/*注意引用头文件QMdiSubWindow */
mdiarea1->activeSubWindow()->resize(this->width()-,this->height()-);
} /*层叠窗口*/
void MainWindow::cascade_window()
{
mdiarea1->cascadeSubWindows();
} /*并列窗口*/
void MainWindow::parallel_window()
{
mdiarea1->tileSubWindows();
} /*帮助*/
void MainWindow::helper_click()
{
QMessageBox::information(this,"帮助信息","暂无帮助信息");
} /*关于*/
void MainWindow::mabout_click()
{
QMessageBox::about(this,"关于","版权所有,侵权必究!");
} /*退出程序事件*/
void MainWindow::closeEvent(QCloseEvent *event)
{
if(QMessageBox::question(this,"退出程序",tr("您确定要退出吗?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::No)==QMessageBox::Yes)
{
event->accept();
}else{
event->ignore();
}
} /*未登录设置所有SQL按钮不可用*/
void MainWindow::close_action()
{
addstation->setEnabled(false);
addstationcontrl->setEnabled(false);
addMSC->setEnabled(false);
delstation->setEnabled(false);
delstationcontrl->setEnabled(false);
delMSC->setEnabled(false);
sestation->setEnabled(false);
sestationcontrl->setEnabled(false);
seMSC->setEnabled(false);
upstation->setEnabled(false);
upstationcontrl->setEnabled(false);
upMSC->setEnabled(false);
exscript->setEnabled(false);
cascade1->setEnabled(false);
parallel->setEnabled(false);
} /*设置所有SQL按钮可用*/
void MainWindow::open_action()
{
addstation->setEnabled(true);
addstationcontrl->setEnabled(true);
addMSC->setEnabled(true);
delstation->setEnabled(true);
delstationcontrl->setEnabled(true);
delMSC->setEnabled(true);
sestation->setEnabled(true);
sestationcontrl->setEnabled(true);
seMSC->setEnabled(true);
upstation->setEnabled(true);
upstationcontrl->setEnabled(true);
upMSC->setEnabled(true);
exscript->setEnabled(true);
cascade1->setEnabled(true);
parallel->setEnabled(true);
} MainWindow::~MainWindow()
{
/*释放数据库连接*/
delete sqlhelper;
}
QT 数据库编程三的更多相关文章
- Qt数据库编程1
Qt中数据编程主要分为以下两点:1.利用qt提供类 访问数据库或者成为简单的数据库编程2.数据库编程中引入model/view编程模型 qt中数据库编程的步骤: 1.加载数据库驱动 QSqlDatab ...
- QT 数据库编程四
//vmysql.cpp #include "vmysql.h" #include <QMessageBox> Vmysql::Vmysql() { mysql_ini ...
- Qt——数据库编程
一.概述 Qt提供了一个类似JDBC的数据库接口,需要为每个可以连接的特定数据库提供驱动程序,可以通过 QStringList QSqlDatabase::drivers() 知道当前版本的Qt哪些驱 ...
- Qt数据库编程_基本
QtSql模块提供了一个平台无关且数据库无关的访问SQL数据库的接口. Qt中的每个数据库连接用一个QSqlDatabase对象来表示:Qt使用不同driver来和各种不同数据库的API进行通讯. Q ...
- QT 数据库编程二
//logindlg.cpp #include "logindlg.h" #include <QGridLayout> #include <QHBoxLayout ...
- QT 网络编程三(TCP版)
QT客户端 //widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpSocket& ...
- QT基于model/view数据库编程2
Qt中数据编程主要分为以下两点:1.利用qt提供类 访问数据库或者成为简单的数据库编程2.数据库编程中引入model/view编程模型 基于model/view数据库编程: qt提供model类: Q ...
- 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库
运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...
- c++学习书籍推荐《C++ GUI Qt 4编程(第2版)》下载
下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 <C++ GUI Qt 4编程(第2版)>讲授的大量Qt4编程原理和实践,都可以轻易将其应用于Qt4.4.Qt4.5及后续版本的Q ...
随机推荐
- XML,DTD,XSD,XSL的区别
XML=可扩展标记语言(eXtensible Markup Language). 可扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可用 方便的方式建立,虽然XML ...
- MetaWeblog API调用
http://rpc.cnblogs.com/metaweblog/webenh 在网上闲逛,突然对博客的接口感兴趣,经考察,多数博客都对metaWeblog Api 提供了支持,虽然windows ...
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- FTP远程文件传输命令
使用ftp命令进行远程文件传输 ftp命令是标准的文件传输协议的用户接口.ftp是在TCP/IP网络上的计算机之间传输文件的简单有效的方法.它允许用户传输ASCII文件和二进制文件. 在ftp会话过程 ...
- MongoDB 常用故障排查工具
1.profile profiling levels: 0,关闭profile:1,只抓取slow查询:2,抓取所有数据. 启动profile并且设置Profile级别: 可以通过mongo shel ...
- Java 代码的基本知识(摘)
(摘自:Java经典入门教程) http://wenku.baidu.com/link?url=IoWI58cD5vzeHN-NL4pN7Gren-RfzydrhjDlETAByC9L-9ANinyL ...
- 父容器根据子容器高度自适应:设置父容器 height:100%;overflow:hidden;
父容器根据子容器高度自适应:设置父容器 height:100%;overflow:hidden;
- 扩展欧几里德算法 cogs.tk 2057. [ZLXOI2015]殉国
2057. [ZLXOI2015]殉国 ★☆ 输入文件:BlackHawk.in 输出文件:BlackHawk.out 评测插件时间限制:0.05 s 内存限制:256 MB [题目描 ...
- 在PYTHON中使用StringIO的性能提升实测(更新list-join对比)
刚开始学习PYTHON,感觉到这个语言真的是很好用,可以快速完成功能实现. 最近试着用它完成工作中的一个任务:在Linux服务器中完成对.xml.gz文件的解析,生成.csv文件,以供SqlServe ...
- 洛谷U4807抽水机[最小生成树]
题目背景 kkk被Farmer John和他的奶牛贝茜虐的很惨,然后她也想体验下一个Farmer的生活.但她又懒得种地,就选择养鱼. 题目描述 这些鱼都是热带鱼(废话),很娇贵(比kkk娇贵),要经常 ...