1. //mainwindow.cpp
  2. #include "mainwindow.h"
  3. #include "logindlg.h"
  4. #include "scriptdlg.h"
  5.  
  6. #include <QMessageBox>
  7. #include <QIcon>
  8. #include <QMdiSubWindow>
  9.  
  10. #include <QStandardItemModel>
  11. #include <QTableView>
  12.  
  13. MainWindow::MainWindow(QWidget *parent)
  14. : QMainWindow(parent)
  15. {
  16. /*设置窗口标题*/
  17. this->setWindowTitle(tr("CDMA无线基站管理系统"));
  18. /*设置窗口光标(窗口左上角图片)*/
  19. this->setWindowIcon(QIcon("main.png"));
  20.  
  21. /*QMdiArea控件只能在MainWindow控件中使用,是用来实现多文档界面的必备控件*/
  22. mdiarea1=new QMdiArea();
  23. /*设置QMdiArea控件的背景图片*/
  24. mdiarea1->setBackground(Qt::NoBrush);
  25. /*背景图片设置为11.jpg,子窗口大小可以调整*/
  26. mdiarea1->setStyleSheet("background-image:url(10.jpg)");
  27. /*当子窗口的范围超过父窗口的显示范围时,设置自动具有横向滚动条*/
  28. mdiarea1->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
  29. /*设置自动具有纵向滚动条*/
  30. mdiarea1->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
  31. this->setCentralWidget(mdiarea1);
  32. /*初始化基本控件*/
  33. initmenubar();
  34.  
  35. /*初始化数据库连接*/
  36. sqlhelper=new Vmysql();
  37. }
  38.  
  39. //初始化控件
  40. void MainWindow::initmenubar()
  41. {
  42. /*管理菜单*/
  43. menu1=this->menuBar()->addMenu(tr("管理"));
  44. login_in=new QAction(tr("登录"),this);
  45. login_in->setShortcut(tr("Ctrl+U"));
  46. connect(login_in,SIGNAL(triggered()),this,SLOT(login_inclick()));
  47. login_out=new QAction(tr("注销"),this);
  48. login_out->setShortcut(tr("Ctrl+B"));
  49. connect(login_out,SIGNAL(triggered()),this,SLOT(login_outclick()));
  50. quit1=new QAction(tr("退出"),this);
  51. quit1->setShortcut(tr("Ctrl+W"));
  52. connect(quit1,SIGNAL(triggered()),this,SLOT(quit_click()));
  53. menu1->addAction(login_in);
  54. menu1->addAction(login_out);
  55. /*加入空格*/
  56. menu1->addSeparator();
  57. menu1->addAction(quit1);
  58.  
  59. /*数据菜单*/
  60. menu2=this->menuBar()->addMenu(tr("数据"));
  61.  
  62. addstation=new QAction(tr("添加基站"),this);
  63. addstation->setShortcut(tr("Ctrl+D"));\
  64. //addstation->setEnabled(false);
  65. connect(addstation,SIGNAL(triggered()),this,SLOT(add_station()));
  66.  
  67. addstationcontrl=new QAction(tr("添加基站控制器"),this);
  68. addstationcontrl->setShortcut(tr("Ctrl+E"));
  69. connect(addstationcontrl,SIGNAL(triggered()),this,SLOT(add_stationcontrl()));
  70.  
  71. addMSC=new QAction(tr("添加MSC"),this);
  72. addMSC->setShortcut(tr("Ctrl+F"));
  73. connect(addMSC,SIGNAL(triggered()),this,SLOT(add_MSC()));
  74.  
  75. delstation=new QAction(tr("删除基站"),this);
  76. delstation->setShortcut(tr("Ctrl+G"));
  77. connect(delstation,SIGNAL(triggered()),this,SLOT(del_station()));
  78.  
  79. delstationcontrl=new QAction(tr("删除基站控制器"),this);
  80. delstationcontrl->setShortcut(tr("Ctrl+H"));
  81. connect(delstationcontrl,SIGNAL(triggered()),this,SLOT(del_stationcontrl()));
  82.  
  83. delMSC=new QAction(tr("删除MSC"),this);
  84. delMSC->setShortcut(tr("Ctrl+I"));
  85. connect(delMSC,SIGNAL(triggered()),this,SLOT(del_MSC()));
  86.  
  87. sestation=new QAction(tr("查询基站"),this);
  88. sestation->setShortcut(tr("Ctrl+J"));
  89. connect(sestation,SIGNAL(triggered()),this,SLOT(sel_station()));
  90.  
  91. sestationcontrl=new QAction(tr("查询基站控制器"),this);
  92. sestationcontrl->setShortcut(tr("Ctrl+K"));
  93. connect(sestationcontrl,SIGNAL(triggered()),this,SLOT(sel_stationcontrl()));
  94.  
  95. seMSC=new QAction(tr("查询MSC"),this);
  96. seMSC->setShortcut(tr("Ctrl+L"));
  97. connect(seMSC,SIGNAL(triggered()),this,SLOT(sel_MSC()));
  98.  
  99. upstation=new QAction(tr("修改基站"),this);
  100. upstation->setShortcut(tr("Ctrl+M"));
  101. connect(upstation,SIGNAL(triggered()),this,SLOT(update_station()));
  102.  
  103. upstationcontrl=new QAction(tr("修改基站控制器"),this);
  104. upstationcontrl->setShortcut(tr("Ctrl+N"));
  105. connect(upstationcontrl,SIGNAL(triggered()),this,SLOT(update_stationcontrl()));
  106.  
  107. upMSC=new QAction(tr("修改MSC"),this);
  108. upMSC->setShortcut(tr("Ctrl+O"));
  109. connect(upMSC,SIGNAL(triggered()),this,SLOT(update_MSC()));
  110.  
  111. exscript=new QAction(tr("执行脚本"),this);
  112. exscript->setShortcut(tr("Ctrl+P"));
  113. connect(exscript,SIGNAL(triggered()),this,SLOT(exec_script()));
  114.  
  115. menu2->addAction(addstation);
  116. menu2->addAction(addstationcontrl);
  117. menu2->addAction(addMSC);
  118. menu2->addAction(delstation);
  119. menu2->addAction(delstationcontrl);
  120. menu2->addAction(delMSC);
  121. menu2->addAction(sestation);
  122. menu2->addAction(sestationcontrl);
  123. menu2->addAction(seMSC);
  124. menu2->addAction(upstation);
  125. menu2->addAction(upstationcontrl);
  126. menu2->addAction(upMSC);
  127. menu2->addAction(exscript);
  128.  
  129. /*窗口菜单*/
  130. menu3=this->menuBar()->addMenu(tr("窗口"));
  131.  
  132. cascade1=new QAction(tr("层叠窗口"),this);
  133. cascade1->setShortcut(tr("Ctrl+Q"));
  134. connect(cascade1,SIGNAL(triggered()),this,SLOT(cascade_window()));
  135.  
  136. parallel=new QAction(tr("并列窗口"),this);
  137. parallel->setShortcut(tr("Ctrl+R"));
  138. connect(parallel,SIGNAL(triggered()),this,SLOT(parallel_window()));
  139.  
  140. menu3->addAction(cascade1);
  141. menu3->addAction(parallel);
  142.  
  143. /*帮助菜单*/
  144. menu4=this->menuBar()->addMenu(tr("帮助"));
  145.  
  146. helper=new QAction(tr("帮助"),this);
  147. helper->setShortcut(tr("Ctrl+s"));
  148. connect(helper,SIGNAL(triggered()),this,SLOT(helper_click()));
  149.  
  150. mabout=new QAction(tr("关于"),this);
  151. mabout->setShortcut(tr("Ctrl+T"));
  152. connect(mabout,SIGNAL(triggered()),this,SLOT(mabout_click()));
  153.  
  154. menu4->addAction(helper);
  155. menu4->addSeparator();
  156. menu4->addAction(mabout);
  157.  
  158. /*未登录,禁用所有按钮*/
  159. close_action();
  160.  
  161. }
  162.  
  163. /*登录*/
  164. void MainWindow::login_inclick()
  165. {
  166. loginDlg logd1;
  167. /*exec()方法会产生一个模式对话框,show()方法只会产生普通的对话框*/
  168. logd1.exec();
  169. /*
  170. * 当模式对话框打开时,主窗口是不能接受输入输出的;
  171. * 当非模式对话框打开时, 主窗口可以接受输入输出
  172. * ----------------------------------
  173. * 模式对话框与非模式对话框的重大区别:
  174. * exec()函数会阻塞当前进程,
  175. * 但是show()不会阻塞当前进程,会使login_inclick()函数直接执行完毕,
  176. * logd1是一个局部变量,login_inclick()函数执行完毕,会导致logd1的内存被释放,
  177. * 从而导致界面上对话框也随着消失,所以用show()看不到结果,
  178. * 但是可以通过将logd1变量定义在堆内存上,避免这种情况,
  179. * 但是这也会导致用户可以打开多个登陆对话框*/
  180. //logd1.show();
  181. if(!logd1.islogin)
  182. {
  183. /*判断用户是否点击了取消按钮*/
  184. return;
  185. }
  186. if(logd1.username.isEmpty())
  187. {
  188. QMessageBox::critical(this,"错误信息","用户名不可以为空!");
  189. return;
  190. }
  191. if(logd1.userpass.isEmpty())
  192. {
  193. QMessageBox::critical(this,"错误信息","密码不可以为空!");
  194. return;
  195. }
  196. if(logd1.dbname.isEmpty())
  197. {
  198. QMessageBox::critical(this,"错误信息","数据库名称不可以为空!");
  199. return;
  200. }
  201. if(logd1.ipaddr.isEmpty())
  202. {
  203. QMessageBox::critical(this,"错误信息","IP地址不可以为空!");
  204. return;
  205. }
  206. /*连接数据库*/
  207. int res=sqlhelper->sql_connect(logd1.ipaddr.toStdString().data()
  208. ,logd1.username.toStdString().data()
  209. ,logd1.userpass.toStdString().data()
  210. ,logd1.dbname.toStdString().data());
  211. if(res<)
  212. {
  213. QMessageBox::critical(this,"错误信息",sqlhelper->ger_error());
  214. }else
  215. {
  216. QMessageBox::information(this,"提示信息","登录成功");
  217. /*开启所有SQL按钮*/
  218. open_action();
  219. }
  220. }
  221.  
  222. //注销
  223. void MainWindow::login_outclick()
  224. {
  225. if(QMessageBox::question(this,"确认退出","您确定要注销吗?",QMessageBox::Ok|QMessageBox::No,QMessageBox::Ok)==QMessageBox::Yes)
  226. {
  227. //断开数据库连接
  228. sqlhelper->sql_disconnect();
  229. /*禁用所有按钮*/
  230. close_action();
  231. }
  232. }
  233.  
  234. //退出
  235. void MainWindow::quit_click()
  236. {
  237. this->close();
  238. }
  239.  
  240. /*添加基站*/
  241. void MainWindow::add_station()
  242. {
  243. //
  244. }
  245.  
  246. /*添加基站控制器*/
  247. void MainWindow::add_stationcontrl()
  248. {
  249. //
  250. }
  251.  
  252. /*添加MSC*/
  253. void MainWindow::add_MSC()
  254. {
  255. //
  256. }
  257.  
  258. /*删除基站*/
  259. void MainWindow::del_station()
  260. {
  261. //
  262. }
  263.  
  264. /*删除基站控制器*/
  265. void MainWindow::del_stationcontrl()
  266. {
  267. //
  268. }
  269.  
  270. /*删除MSC*/
  271. void MainWindow::del_MSC()
  272. {
  273. //
  274. }
  275.  
  276. /*查询基站*/
  277. void MainWindow::sel_station()
  278. {
  279. //
  280. }
  281.  
  282. /*查询基站控制器*/
  283. void MainWindow::sel_stationcontrl()
  284. {
  285. //
  286. }
  287.  
  288. /*查询MSC*/
  289. void MainWindow::sel_MSC()
  290. {
  291. //
  292. }
  293.  
  294. /*修改基站*/
  295. void MainWindow::update_station()
  296. {
  297. //
  298. }
  299.  
  300. /*修改基站控制器*/
  301. void MainWindow::update_stationcontrl()
  302. {
  303. //
  304. }
  305.  
  306. /*修改MSC*/
  307. void MainWindow::update_MSC()
  308. {
  309. //
  310. }
  311.  
  312. /*执行脚本*/
  313. void MainWindow::exec_script()
  314. {
  315. ScriptDlg w1;
  316. w1.exec();
  317. if(!w1.isexec) return;
  318. exec_query(w1.strsql.toStdString().data());
  319. }
  320.  
  321. /*执行SQL查询*/
  322. void MainWindow::exec_query(const char *strsql)
  323. {
  324. if(!judge_sqltype(strsql))
  325. {
  326. //执行SQL更新
  327. if(sqlhelper->sql_exec(strsql)<)
  328. {
  329. QMessageBox::critical(this,"错误提示",sqlhelper->ger_error());
  330. }
  331. }else
  332. {
  333. //执行SQL查询
  334. QStandardItemModel *model=NULL;
  335. if(sqlhelper->sql_query(strsql,&model)<)
  336. {
  337. QMessageBox::critical(this,"错误提示",sqlhelper->ger_error());
  338. return;
  339. }
  340. if(model==NULL)
  341. {
  342. QMessageBox::critical(this,"错误提示","model 为空!");
  343. return;
  344. }
  345. /*创建view*/
  346. display_view("查询结果",model);
  347. }
  348. }
  349.  
  350. /*判断SQL操作的类型*/
  351. bool MainWindow::judge_sqltype(const char *strsql)
  352. {
  353. bool flag=true;
  354. //1.判断SQL执行的是查询还是更新
  355. char tempbuf[]={};
  356. /*遍历字符数据,将第一个空格前的所有字符转化成大写*/
  357. for(int i=;i<(int)strlen(strsql);i++)
  358. {
  359. if(strsql[i]!=' ')
  360. {
  361. if(strsql[i]>&&strsql[i]<)
  362. {
  363. //小写转化成大写
  364. tempbuf[i]=strsql[i]-;
  365. }else
  366. {
  367. tempbuf[i]=strsql[i];
  368. }
  369. }else
  370. {
  371. break;
  372. }
  373. }
  374. if(strncmp(tempbuf,"SET",)==)
  375. {
  376. flag=false;
  377. }else if(strncmp(tempbuf,"INSERT",)==)
  378. {
  379. flag=false;
  380. }else if(strncmp(tempbuf,"DELETE",)==)
  381. {
  382. flag=false;
  383. }else if(strncmp(tempbuf,"UPDATE",)==)
  384. {
  385. flag=false;
  386. }else if(strncmp(tempbuf,"USE",)==)
  387. {
  388. flag=false;
  389. }
  390. return flag;
  391. }
  392.  
  393. /*创建显示view*/
  394. void MainWindow::display_view(const char *actionname,QStandardItemModel *model)
  395. {
  396. /*在QT中,model中存放数据,view中显示数据*/
  397. /*定义view,QTableView继承于QWidget,QTableView在被销毁的同时,会自动销毁对应的model*/
  398. QTableView *view1=new QTableView();
  399. /*代表关闭这个widget的时候,自动将这个widget delete*/
  400. view1->setAttribute(Qt::WA_DeleteOnClose);
  401. /*多文档控件QMdiArea通过addSubWindow()将一个widget变成一个子窗口*/
  402. mdiarea1->addSubWindow(view1);
  403. view1->setWindowTitle(actionname);
  404. /*设置背景图片*/
  405. view1->setStyleSheet("background-image:url(11.jpg)");
  406.  
  407. /*view1继承于QWidget,如果没有model,那么view不会显示数据*/
  408. view1->setModel(model);
  409. view1->show();
  410. /*必须在show()方法之后使用activeSubWindow()获取在最前面的子窗口*/
  411. /*多文档中的子窗口widget设置大小,用resize()方法没有效果*/
  412. //w1->resize(300,200);
  413. /*QMdiArea控件通过activeSubWindow()方法得到当前活动窗口(最前边的子窗口)*/
  414. /*注意引用头文件QMdiSubWindow */
  415. mdiarea1->activeSubWindow()->resize(this->width()-,this->height()-);
  416. }
  417.  
  418. /*层叠窗口*/
  419. void MainWindow::cascade_window()
  420. {
  421. mdiarea1->cascadeSubWindows();
  422. }
  423.  
  424. /*并列窗口*/
  425. void MainWindow::parallel_window()
  426. {
  427. mdiarea1->tileSubWindows();
  428. }
  429.  
  430. /*帮助*/
  431. void MainWindow::helper_click()
  432. {
  433. QMessageBox::information(this,"帮助信息","暂无帮助信息");
  434. }
  435.  
  436. /*关于*/
  437. void MainWindow::mabout_click()
  438. {
  439. QMessageBox::about(this,"关于","版权所有,侵权必究!");
  440. }
  441.  
  442. /*退出程序事件*/
  443. void MainWindow::closeEvent(QCloseEvent *event)
  444. {
  445. if(QMessageBox::question(this,"退出程序",tr("您确定要退出吗?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::No)==QMessageBox::Yes)
  446. {
  447. event->accept();
  448. }else{
  449. event->ignore();
  450. }
  451. }
  452.  
  453. /*未登录设置所有SQL按钮不可用*/
  454. void MainWindow::close_action()
  455. {
  456. addstation->setEnabled(false);
  457. addstationcontrl->setEnabled(false);
  458. addMSC->setEnabled(false);
  459. delstation->setEnabled(false);
  460. delstationcontrl->setEnabled(false);
  461. delMSC->setEnabled(false);
  462. sestation->setEnabled(false);
  463. sestationcontrl->setEnabled(false);
  464. seMSC->setEnabled(false);
  465. upstation->setEnabled(false);
  466. upstationcontrl->setEnabled(false);
  467. upMSC->setEnabled(false);
  468. exscript->setEnabled(false);
  469. cascade1->setEnabled(false);
  470. parallel->setEnabled(false);
  471. }
  472.  
  473. /*设置所有SQL按钮可用*/
  474. void MainWindow::open_action()
  475. {
  476. addstation->setEnabled(true);
  477. addstationcontrl->setEnabled(true);
  478. addMSC->setEnabled(true);
  479. delstation->setEnabled(true);
  480. delstationcontrl->setEnabled(true);
  481. delMSC->setEnabled(true);
  482. sestation->setEnabled(true);
  483. sestationcontrl->setEnabled(true);
  484. seMSC->setEnabled(true);
  485. upstation->setEnabled(true);
  486. upstationcontrl->setEnabled(true);
  487. upMSC->setEnabled(true);
  488. exscript->setEnabled(true);
  489. cascade1->setEnabled(true);
  490. parallel->setEnabled(true);
  491. }
  492.  
  493. MainWindow::~MainWindow()
  494. {
  495. /*释放数据库连接*/
  496. delete sqlhelper;
  497. }

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. linux 学习随笔-group和user管理

    1:/etc/passwd 打开该文件,可以看到每一行内容被分割成了7个字段比如:root:x:0:0:root:/root:/bin/bash 第一个字段表示用户名为root用户 第二个字段存放了该 ...

  2. Eclipse下使用SVN版本控制

    作者:朱先忠编译 转自天极[url]http://dev.yesky.com/356/2578856.shtml[/url] 简单介绍一些基本操作1.同步在Eclipse下,右击你要同步的工程-tea ...

  3. WPF学习之路(八)页面

    传统的应用程序中有两类应用程序模式:桌面应用,Web应用.WPF的导航应用程序模糊了这两类应用程序的界限的第三类应用程序 WPF导航表现为两种形式,一是将导航内容寄宿于窗口,二是XAML浏览器应用程序 ...

  4. laravel excel迁移到lumen

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和 导出  ...

  5. Spark SQL 之 Performance Tuning & Distributed SQL Engine

    Spark SQL 之 Performance Tuning & Distributed SQL Engine 转载请注明出处:http://www.cnblogs.com/BYRans/ 缓 ...

  6. JVM探索之——内存管理(一)

    本系列的第一篇文章,预计本系列最后面会有两三个案例. Java与C.C++不一样Java不需要Coder进行手动内存管理,而这一切都交给JVM进行自动内存管理,这从某种程度上来说也减轻了我们Coder ...

  7. 使用 jsoup 解析HTML

    // 参考资料: // http://www.jb51.net/article/43485.htm @Test public void AnalysisHTMLByString() { String ...

  8. 错误 未能找到类型或命名空间名称 (是否缺少 using 指令或程序集引用?)

    有时发现,明明引用了,结果却提示未引用, 这时就有可能是两个程序集的目标框架类型不一致导致的(在程序集属性面板里改下即可).

  9. CentOS6.5搭建LNMP

      1:查看环境: ? 1 2 [root@10-4-14-168 html]# cat /etc/redhat-release CentOS release 6.5 (Final) 2:关掉防火墙 ...

  10. 谈谈Lucene和Solr索引存目录

    在Lucene中,有几种索引存放模式呢?用过的人可能记得SimpleFSDirectory.MMapDirectory.NIOFSDirectory.RAMDirectory这四种.新版本的通过FSD ...