QT中对Windows API的应用

    技术2022-05-20  69

        今天在QT中使用Windows API,主要用了几个有关注册表的函数。RegOpenKeyEx()、RegCreateKeyEx()、RegQueryValueEx()、RegSetValueEx()、RegCloseKey()、RegDeleteValue()、RegDeleteKey(),对于这几个函数的使用都还是很成功的。主要注意参数的正确设置。后来查了有关资料,才知道QT里面对于注册表的操作已经有现成的类QSettings,而且使用起来非常方便。具体的我没有去试,用到的时候在看吧。现在想想QT的确是很强大啊,把Windows的一些底层操作都做好了封装。开始还想着QT能够使用Windows API已经很不错了,没想到如此方便。

        对于XML文件的处理QT也都给我们做好了类:QT对XML的处理分为DOM实现和SAX实现

        1、DOM实现是将整个XML文件当做对象装入内存进行处理,优点操作简单,缺点不宜处理过大文件,在QT中实现类是QDomDocument。弄了一下午我都是用很笨拙的方法一层一层的往里面找自己需要的字段内容。

         if(!doc.setContent(&file,true,&errorStr,&errorLine,&errorCol))//转化成功 { } QDomNodeList list = doc.childNodes();//第一层节点 for(int i = 0; i < list.count(); i++) { QDomNode node = list.at(i); while(!node.isNull()) { if(node.isElement()) { QDomNodeList list1= node.childNodes();//第二层节点 for(int i = 0; i < list1.count(); i++) { QDomNode node1 = list1.at(i); while(!node1.isNull()) { if(node1.isElement()) { QDomElement ele = node1.toElement(); QString eleStr = ele.tagName(); if(eleStr == QString::fromUtf8("beforecopy")) { QDomNodeList list2 = node1.childNodes();//第三层节点 QDomNode node2 = list2.at(0); while(!node2.isNull()) { if(node2.isElement()) { QDomElement element = node2.toElement(); beforeExeStr = element.text(); break; } } } if(eleStr == QString::fromUtf8("copy")) { QDomNodeList list2 = node1.childNodes();//第三层节点 QDomNode node2 = list2.at(0); while(!node2.isNull()) { if(node2.isElement()) { QDomElement element = node2.toElement(); Path[index].Content = element.text(); break; } } node2 = list2.at(1); while(!node2.isNull()) { if(node2.isElement()) { QDomElement element = node2.toElement(); Path[index].SrcPath = element.text(); break; } } node2 = list2.at(2); while(!node2.isNull()) { if(node2.isElement()) { QDomElement element = node2.toElement(); Path[index++].DestPath = element.text(); break; } } } if(eleStr == QString::fromUtf8("aftercopy")) { QDomNodeList list2 = node1.childNodes();//第三层节点 QDomNode node2 = list2.at(0); while(!node2.isNull()) { if(node2.isElement()) { QDomElement element = node2.toElement(); afterExeStr = element.text(); break; } } } break; } } } break; } } }

        这样的办法使用起来很笨拙,很多地方都是在重复操作,我想把它们优化一下,弄个递归什么的。但是没有想到好的办法,因为自己的XML文件毕竟是变化多端的,以后再找找有没有什么好的方法。

        另外一个方法,下次试验了在来写写。

        学习QT也没多长时间,对于里面的很多东西都还不是很了解,感觉和MFC在对Windows API的封装上有一些相似了。像MFC中字符串的处理是用CString类、文件的处理有CFile、CstdioFile类等;而QT字符串处理有QString、文件处理有QFile。当然QT应该比MFC强大的多,无论是界面的制作,还有底层的结构。QT这样的几乎完全的面向对象的特性,使我们学习使用起来都很方便。

      

     


    最新回复(0)