//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 数据库编程三的更多相关文章

  1. Qt数据库编程1

    Qt中数据编程主要分为以下两点:1.利用qt提供类 访问数据库或者成为简单的数据库编程2.数据库编程中引入model/view编程模型 qt中数据库编程的步骤: 1.加载数据库驱动 QSqlDatab ...

  2. QT 数据库编程四

    //vmysql.cpp #include "vmysql.h" #include <QMessageBox> Vmysql::Vmysql() { mysql_ini ...

  3. Qt——数据库编程

    一.概述 Qt提供了一个类似JDBC的数据库接口,需要为每个可以连接的特定数据库提供驱动程序,可以通过 QStringList QSqlDatabase::drivers() 知道当前版本的Qt哪些驱 ...

  4. Qt数据库编程_基本

    QtSql模块提供了一个平台无关且数据库无关的访问SQL数据库的接口. Qt中的每个数据库连接用一个QSqlDatabase对象来表示:Qt使用不同driver来和各种不同数据库的API进行通讯. Q ...

  5. QT 数据库编程二

    //logindlg.cpp #include "logindlg.h" #include <QGridLayout> #include <QHBoxLayout ...

  6. QT 网络编程三(TCP版)

    QT客户端 //widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpSocket& ...

  7. QT基于model/view数据库编程2

    Qt中数据编程主要分为以下两点:1.利用qt提供类 访问数据库或者成为简单的数据库编程2.数据库编程中引入model/view编程模型 基于model/view数据库编程: qt提供model类: Q ...

  8. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...

  9. c++学习书籍推荐《C++ GUI Qt 4编程(第2版)》下载

    下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 <C++ GUI Qt 4编程(第2版)>讲授的大量Qt4编程原理和实践,都可以轻易将其应用于Qt4.4.Qt4.5及后续版本的Q ...

随机推荐

  1. IOS block 循环引用的解决

    在介绍block循环引用前我们先了解一下typeof. typeof是什么??? typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类 ...

  2. 学习 jsonp

    1.起因 js脚本做ajax异步调用的时候,直接请求普通文件存在跨域无权限访问的问题,不管你是静态页面.动态网页.web服务,只要是跨域请求,都无法成功: 如果上句话没明白,我们直接看例子.有两个一模 ...

  3. HTML <fieldset> 标签

    <div style="height:360px;width:180"> <fieldset> <legend> 用户管理 </legen ...

  4. #VSTS日志# 2015/12/10 – 终于可以删除工作项了

    最近的更新不少,废话少说,直接上干货 定制工作项字段 本周的更新后,所有的用户都可以在vsts上直接给工作项添加字段了,具体内容包括– 添加新字段(日期,字符串,整形,数字)– 字段显示位置配置– 过 ...

  5. yii2发送邮件教程

    作者:白狼 出处:http://www.manks.top/article/yii2_swiftMailer本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, ...

  6. input 默认值为灰色,输入时清楚默认值

    input 默认值为灰色,输入时清楚默认值 <input value="please input your name" onFocus="if(value==def ...

  7. JavaScript Patterns 5.7 Object Constants

    Principle Make variables shouldn't be changed stand out using all caps. Add constants as static prop ...

  8. User Word Automation Services and Open XML SDK to generate word files in SharePoint2010

    SharePoint 2010 has established a new service called "Word Automation Services" to operate ...

  9. VIM使用技巧总结

    一.vim使用的基本配置 1: set nu //设置行号 2: set ts=4 //设置tab为4个空格大小 3: set expandtab //设置用空格代替tab 4: set ai //设 ...

  10. hadoop2.3cdh5.0.2 upgrade to hadoop2.5cdh5.5.0

    两台机器,nn1,nn2搭建的ha,同时又担任nn,dn,rm,nm,jn,zkfc,zk等职能. 以下是升级回滚再升级的记录.仅供参考,同时参考了cdh官网的说明,官网主要是使用CM的. 1 官网上 ...