用Qt 4.4编写drcom的GUI (转)
经过了一个小程序的练手,应该写点实用的东西了。学校里上网需要使用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 (转)相关推荐
- Qt 使用代码编写的自定义控件类
Qt 使用代码编写的自定义控件类 首先需要完成继承QWidget 或者Qt 原生控件类的类编写实现 在需要使用自定义控件类的 UI 文件中添加一个 自定义类的控件(也就是自定义类继承的控件) 将这个控 ...
- QT中如何实现Thread与GUI的主线程连通
QT中如何实现Thread与GUI的主线程连通 本文介绍的是QT中实现Thread与GUI主线程通,目前只会一种,采用信号槽机制. 通常情况下,信号和槽机制可以同步操作,这就意味着在发射信号的时候,使 ...
- python qt库,用于 Python 的高级 GUI 库(Qt 和 PyQt)(1)Unix系统 -电脑资料
Qt 工具箱是一个使用广泛的跨平台 GUI 工具箱,可用于 Windows .Linux.Mac OSX 和许多手持平台, Qt 工具箱是一个使用广泛的跨平台 GUI 工具箱,可用于Windows.L ...
- qt自定义控件_Qt编写自定义控件60-声音波形图
一.前言 这个控件源自于一个音乐播放器,在写该音乐播放器的时候,需要将音频的数据转换成对应的频谱显示,采用的fmod第三方库来处理(fmod声音系统是为游戏开发者准备的革命性音频引擎,非常强大和牛逼) ...
- 【QT上位机编写第三步】编写一个电压、电流显示串口上位机
文章目录 一.上位机的信号和槽函数? 二.上位机软件编程 2.1.模块和类导入 2.1.首先是写串口初始化 2.1.串口读取 2.2.串口写入 2.3.清除数据框的内容 2.4.自动搜索串口端口号 三 ...
- Qt和wxWidgets 比较 以及其他GUI库
这个,我个人觉得Qt比wxwidgets有前途多了,无论是资源还是人数,还是社区.关键是QT有商业公司和社区支持. 现在的QT无孔不入,win,linux,IOS,android,嵌入式板子,pyQT ...
- QT 多线程的实现方法以及GUI线程与其他线程间的通信
GUI线程 Qt应用程序exec后就会生成一个线程,这个线程就是主线程,在GUI程序中也称为GUI线程.主线程也是唯一允许创建QApplication或QCoreAppliation对象,比并且可以对 ...
- label qt 自动换行_QT编写一个登录界面
前言 继上篇:一起学Qt之基础篇---入门 今天上手实操用QT编写一个登录界面~ 系统权限这个词大家肯定不陌生,你进入一个网站也是,如果不登录,就是以游客的身份进去的,要想看到某些信息肯定需要进行登录 ...
- 为QT的Webkit 编写插件
为了允许的QWebView加载插件,必须使能QWebView的Javascript和Plugins属性,使能方法为: QWebSettings::globalSettings()->setAtt ...
最新文章
- Win10 + VS2017 15.5.6 环境下解决 Python 3.6 环境无法刷新DB的问题
- ICCV 2017 《Towards End-to-End Text Spotting with Convolutional Recurrent Neural Network》论文笔记
- photoshop cs5快捷键的用法总结
- 程序员别埋头苦干了,花时间学点薪资谈判技巧多赚一个亿可好?
- 文件夹重命名导致软件图标不显示问题解决
- kotlin 实战之核心基础特性总结
- 【系统分析师】操作系统
- 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错 - 细雨淅淅
- 一种简洁的流式推送文件分享法
- php deel views,全量修改文件App名称和改动views位置设置
- 如何卸载Win10关键更新(右键不显示卸载)
- 所有计算机专业的学生应该认识到的
- Linux查看历史命令 history
- 2022起重机械指挥考试模拟100题及答案
- linux常见缩写与全称
- 树莓派 CM4 启动时 GPIO口输出
- 学习记录:UnityHDRP高清渲染管线学习 day1
- 机器学习(三) 线性回归
- Java项目:酒店宾馆管理系统(java+SpringBoot+html+layui+jQuery+maven+mysql)
- 全球及各国重要数据网站集锦-数学建模(二十一)