经过了一个小程序的练手,应该写点实用的东西了。学校里上网需要使用drcom客户端进行登录。虽然sourceforge有一个linux的drcom客户端的开源项目,但是这是一个基于命令行的程序,开始用起来不是很方便。
对drcom-1.4.7的分析:
      drcom分为drcomc,drcomd和一个内核模块。没有看过linux内核的编程,内核模块直接略过。drcomd是这个程序的守护程序,负责接收drcomc发送过去的指令,并向服务器提交相应的指令。drcomc是客户端程序,通过命令行参数,向drcomc发送登录、注销和修改密码的指令。两者之间通过UNIX的进程间内部socket进行通信。
      最早写drcom的GUI是针对drcom-1.3.7的,那时候自己电脑的内核还是2.6.22的,于是就根据那个版本的drcom写了一个实现drcomc功能的GUI。现在针对drcom-1.4.7的GUI,也仅仅实现了drcomc的功能,所以还不是很方便。但是相比较前面的版本,稍微多加了一点人性化的功能。
      首先,加入了修改drcom.conf文件的功能,能够方便的在一个对话框中可视化的修改配置内容。因为drcom-1.4.7中,多加了一个device的选项,以前的mac选项都变成可选的了,但是对于自己修改过mac地址的人来说,mac选项还是必要的,否则drcomd将会使用从设备中读取到的mac地址来连接服务器。因此,通过Qt4的QNetworkInterface类,得到电脑上每一个网络设备的mac地址。
相关代码:foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces())
             {
                    NIC->addItem(interface.name());
              }
使用QNetworkInterface的静态函数allInterfaces(),取得电脑上所有的网络设备(包括本地回路)。然后使用Qt的foreach宏,遍历整个列表,将每个设备名添加到NIC中(一个comboBox的对象)。
    interface = QNetworkInterface::interfaceFromName(interfaceName);
    if(interface.isValid())
    {
        localMAC->setText(tr("MAC地址:") +  interface.hardwareAddress());
    }
每次下拉框(comboBox)被改动之后,调用该函数,判断网络接口名是否正确,并读取该网络接口名的mac地址(hardwareAddress)。


配置的设置窗口(没有使用root权限,无法读取/etc/drcom.conf文件)
 

由于学校的网费充值是通过专门的充值网页进行的,为了方便充值(也借鉴了windows版的drcom),在菜单栏中增加了充值网页这个按钮(Action)。
      Qt4.4新增加了对webkit的支持,这使得显示网页变得非常容易:
首先加载显示网页所需的头文件:#include <QWebView>
然后声明一个QWebView的指针,然后加载(QWebView::load())需要打开的地址,最后调用显示函数(QWebView::show()):
    QWebView *view = new QWebView(0);
    view->load(QUrl("http://xx.xx.xx/"));
    view->show();
      这里只是简单的显示网页,没有实现一些浏览器的基本功能(比如自动完成表单),因此只需要简单使用QWebView类就可以了,不需要使用其他webkit的类。相关的类还有: QWebFrame(用于控制网页的框架),QWebHistory(操作网页的历史),QWebPage(网页相关)等。
      不过,需要注意的是,Qt默认不会加载QtWebkit的链接库,如果需要使用该链接库,需要在.pro文件中添加QT += webkit ,这样才能让qmake在生成Makefile文件的时候,加入对webkit链接库的连接。


使用QtWebkit加载的充值网页
 

上次的显示网页模块感觉做的不是很人性话,明明可以直接从本地得到用户名和密码,但是却没有能够好好利用这些内容,让用户多输入了这些信息。
      为了实现自动填充网页中的表单,找了很长时间。刚开始,没有什么概念,就利用刚刚学到的html知识,直接从QWebView->QWebFrame->QWebFrame,然后从webFrame中提取网页表单中的相关元素,修改网页的源代码之后重新显示。
QString html = parentFrame->toHtml();    //得到html源代码
int pos = html.indexOf("\"name\"");         //搜索代码中的"name"字符串(包含引号)
pos = html.indexOf(">",pos);                  //搜索该输入框的结尾
html.insert(pos," value='xxx' ");              //添加value的值
parentFrame->setHtml(html,parentFrame->url());//使用新的html显示,并指定根路径为原URL
      这样的方法是可以实现在表单中预填充字符的,但是由于重新调用了setHtml()函数重新加载网页,重新加载完毕后,webView还是会发射loadFinished(bool)信号的。因此,在这个函数中,需要使用一个标记来确定是否是第二次加载网页。(为了提取html,必须将loadFinished(bool)信号连接到自定义的槽,否则在未加载完网页之前调用toHtml()不能得到网页的html代码)。
      在网上搜索了关于webkit处理javascript之后,了解到QWebFrame中还有一个evaluateJavaScript()函数,该函数的参数是QString,会将传入的字符串当作javascript代码进行解析。因此,可以对网页的frame使用该函数,添加javascript代码,就能很轻松的操作表单了。
parentFrame->evaluateJavaScript("document.LOGIN.name.value='xxx'");
view->show();
使用这个函数非常方便,不需要写脚本的标记符,也不用加上“;”(正因为这样,好像不能执行多条javascript语句)。
      终于又为那个程序多加了一个功能,现在只差控制守护进程的功能了。

转载于:https://blog.51cto.com/no001/394422

用Qt 4.4编写drcom的GUI (转)相关推荐

  1. Qt 使用代码编写的自定义控件类

    Qt 使用代码编写的自定义控件类 首先需要完成继承QWidget 或者Qt 原生控件类的类编写实现 在需要使用自定义控件类的 UI 文件中添加一个 自定义类的控件(也就是自定义类继承的控件) 将这个控 ...

  2. QT中如何实现Thread与GUI的主线程连通

    QT中如何实现Thread与GUI的主线程连通 本文介绍的是QT中实现Thread与GUI主线程通,目前只会一种,采用信号槽机制. 通常情况下,信号和槽机制可以同步操作,这就意味着在发射信号的时候,使 ...

  3. python qt库,用于 Python 的高级 GUI 库(Qt 和 PyQt)(1)Unix系统 -电脑资料

    Qt 工具箱是一个使用广泛的跨平台 GUI 工具箱,可用于 Windows .Linux.Mac OSX 和许多手持平台, Qt 工具箱是一个使用广泛的跨平台 GUI 工具箱,可用于Windows.L ...

  4. qt自定义控件_Qt编写自定义控件60-声音波形图

    一.前言 这个控件源自于一个音乐播放器,在写该音乐播放器的时候,需要将音频的数据转换成对应的频谱显示,采用的fmod第三方库来处理(fmod声音系统是为游戏开发者准备的革命性音频引擎,非常强大和牛逼) ...

  5. 【QT上位机编写第三步】编写一个电压、电流显示串口上位机

    文章目录 一.上位机的信号和槽函数? 二.上位机软件编程 2.1.模块和类导入 2.1.首先是写串口初始化 2.1.串口读取 2.2.串口写入 2.3.清除数据框的内容 2.4.自动搜索串口端口号 三 ...

  6. Qt和wxWidgets 比较 以及其他GUI库

    这个,我个人觉得Qt比wxwidgets有前途多了,无论是资源还是人数,还是社区.关键是QT有商业公司和社区支持. 现在的QT无孔不入,win,linux,IOS,android,嵌入式板子,pyQT ...

  7. QT 多线程的实现方法以及GUI线程与其他线程间的通信

    GUI线程 Qt应用程序exec后就会生成一个线程,这个线程就是主线程,在GUI程序中也称为GUI线程.主线程也是唯一允许创建QApplication或QCoreAppliation对象,比并且可以对 ...

  8. label qt 自动换行_QT编写一个登录界面

    前言 继上篇:一起学Qt之基础篇---入门 今天上手实操用QT编写一个登录界面~ 系统权限这个词大家肯定不陌生,你进入一个网站也是,如果不登录,就是以游客的身份进去的,要想看到某些信息肯定需要进行登录 ...

  9. 为QT的Webkit 编写插件

    为了允许的QWebView加载插件,必须使能QWebView的Javascript和Plugins属性,使能方法为: QWebSettings::globalSettings()->setAtt ...

最新文章

  1. Win10 + VS2017 15.5.6 环境下解决 Python 3.6 环境无法刷新DB的问题
  2. ICCV 2017 《Towards End-to-End Text Spotting with Convolutional Recurrent Neural Network》论文笔记
  3. photoshop cs5快捷键的用法总结
  4. 程序员别埋头苦干了,花时间学点薪资谈判技巧多赚一个亿可好?
  5. 文件夹重命名导致软件图标不显示问题解决
  6. kotlin 实战之核心基础特性总结
  7. 【系统分析师】操作系统
  8. 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错 - 细雨淅淅
  9. 一种简洁的流式推送文件分享法
  10. php deel views,全量修改文件App名称和改动views位置设置
  11. 如何卸载Win10关键更新(右键不显示卸载)
  12. 所有计算机专业的学生应该认识到的
  13. Linux查看历史命令 history
  14. 2022起重机械指挥考试模拟100题及答案
  15. linux常见缩写与全称
  16. 树莓派 CM4 启动时 GPIO口输出
  17. 学习记录:UnityHDRP高清渲染管线学习 day1
  18. 机器学习(三) 线性回归
  19. Java项目:酒店宾馆管理系统(java+SpringBoot+html+layui+jQuery+maven+mysql)
  20. 全球及各国重要数据网站集锦-数学建模(二十一)

热门文章

  1. eclipse安装JAVA反编译插件
  2. 【读】这一次,让我们再深入一点 - UDP协议
  3. PHP命名空间(Namespace)的使用详解(转)
  4. Java学习笔记(5)——泛型
  5. 25个强大的 jQuery 砌体网页设计作品
  6. 在内部循环中Continue外部循环
  7. 经过不断努力 终于获得“推荐博客”的荣誉
  8. 如何为网站项目添加子项目
  9. BCH到底该采用哪种交易排序规则?
  10. 纽约州金融服务局(NYDFS)为比特币现金(BCH)打开绿灯