2021-04-15qt对XML文件的使用

2021-04-15qt对XML文件的使用,第1张

创建一个XML文件

1:创建一个文件对象(QFile),创建文件对象的时候可能会出现两种情况,一是文件已存在,二是

文件不存在,文件存在则我们可以直接拿来使用,不存在则需要创建

2:创建文件之后则是打开文件,并且指定文件的读写权限

3:创建一个QDomDocument文档对象

4:创建一个XML头部格式

5:将前面创建的XML头部格式追加到前面创建的XML文档对象卖册中

6:创建根节点

7:将创建的根节点追加到前面创建的XML文档对象中

8:创建一个文本流并且将它和我们前面创建的文件对象关联起来

9:将文本流中的内容保存到我们前面创建的QDomDocument对象中,并且指定文档以几个字符缩进

10:在创建完成后,假如没有其它的 *** 作则将文件对象关闭

/***

void DocXML::createXML(QString file_path)

{

    QFile file(file_path)//关联文件名字

    if(true==file.exists())//如果存在不创建袜昌

    {

        cout<<"文件已经存在"

        return

    }

    else

    {

        //不存在创建

        //只写文件

        bool isOK=file.open(QIODevice::WriteOnly)

        if(true==isOK)//如果打开成功

        {

            //创建XML文档

            QDomDocument doc

            //创建XML头部格式

            QDomProcessingInstruction ins

            ins=doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'utf-8\'")

            //追加元素

            doc.appendChild(ins)

            //创建根节点

            QDomElement root=doc.createElement(QStringLiteral("日销售清单"))

            //QDomElement root=doc.createElement("helloworld")

            //追加

            doc.appendChild(root)

            //保存

            QTextStream stream(&file)//和文本流关联文件

            doc.save(stream,4)//保存文件并且以4个字符的方式缩进

            //关闭文件

            file.close()

        }

        else

        {

            cout<<"writeOnly error"

        }

    }

}

**/

向一个已存在的XML文件对象中添加节点和元素:

1:打开一个已存在的XML文档,并将打开函数的返回值保存下来

2:在返回值为真的情况下,我们将文件和一个QDomDocument关联起来,将关联函数的返回值保存起来

3:在关联函数的返回值为真的情况下,我们可以将前面打开的文件对象关闭

4:获取根节点元素

5:获取当前时间

6:将我们获取的当前日期转换为字符串

7:判断我们前面获取的根节点下面有没有子节点

8:在没有的情况下,我们创建一个日期子节点

9:创建一个属性值

10:设置前面创建的属性值

11:将我们创建的日期节点和我们前面创建的属性关联起来

12:将我们创建的日期节点追加到根节点下

13:写入有效数据

13.1:获取当前时间

13.2:将获取的时间转换为字符串

13.3:创建中好宏一个新的时间节点元素

13.4:创建一个属性

13.5:给我们创建的属性设置值

13.6:将时间节点元素和我们前面创建的时间节点关联

13.7:将时间节点追加到最开始创建的那个日期节点后面

13.8:创建节点里的元素

13.9:将元素和节点关联

13.10:将新的节点追加到父节点哪里

void DocXML::appendXML(QString file_Path, QStringList list)

{

    QFile file(file_Path)

    bool isOK=file.open(QIODevice::ReadOnly)

    if(true==isOK)

    {

        //文件和xml广联

        QDomDocument doc

        isOK=doc.setContent(&file)

        if(isOK)

        {

            file.close()//关联成功后关闭文件

            //获取根节点元素

            QDomElement root=doc.documentElement()

            //获取当前时间

            QDateTime date=QDateTime::currentDateTime()

            //将获取的时间装换位字符串

            QString dateStr=date.toString("yyyy-MM-dd")//2021-01-08

            //判断根节点下有没有子节点

            if(root.hasChildNodes())//有子节点

            {

            }

            else//没有子节点

            {

                //创建日期子节点

                QDomElement dataEmt=doc.createElement(QStringLiteral("日期"))

                //创建date属性

                QDomAttr dataAttr=doc.createAttribute("date")

                //设置属性的值

                dataAttr.setNodeValue(dateStr)

                //把节点和属性关联

                dataEmt.setAttributeNode(dataAttr)

                //把日期节点追加到根节点下

                root.appendChild(dataEmt)

                //写有效数据

                writeXML(doc,dataEmt,list)

            }

            //保存文件

            isOK=file.open(QIODevice::WriteOnly)

            if(isOK)

            {

                QTextStream stream(&file)

                doc.save(stream,4)

                file.close()

            }

        }

        else

        {

            cout<<"setContent error"

            return

        }

    }

    else

    {

        cout<<"readOnly error"

    }

}

void DocXML::writeXML(QDomDocument &doc, QDomElement &root, QStringList &list)

{

    //获取当前时间

    QDateTime tiem=QDateTime::currentDateTime()

    //将获取的时间装换位字符串

    QString timeStr=tiem.toString("hh-mm-ss")//16:05:03

    //创建时间节点元素

    QDomElement timeEmt=doc.createElement(QStringLiteral("时间"))

    //创建属性

    QDomAttr timeAtrr=doc.createAttribute("time")

    //给属性设置值

    timeAtrr.setNodeValue(timeStr)

    //时间节点元素和时间节点关联

    timeEmt.setAttributeNode(timeAtrr)

    //把时间节点追加到日期节点后面

    root.appendChild(timeEmt)

    //创建节点里的元素

    QDomElement factory=doc.createElement(QStringLiteral("厂家"))

    QDomElement brand=doc.createElement(QStringLiteral("品牌"))

    QDomElement price=doc.createElement(QStringLiteral("报价"))

    QDomElement number=doc.createElement(QStringLiteral("数量"))

    QDomElement total=doc.createElement(QStringLiteral("金额"))

    //将元素和节点关联

    QDomText text=doc.createTextNode(list.at(0))

    factory.appendChild(text)

    text=doc.createTextNode(list.at(1))

    brand.appendChild(text)

    text=doc.createTextNode(list.at(2))

    price.appendChild(text)

    text=doc.createTextNode(list.at(3))

    number.appendChild(text)

    text=doc.createTextNode(list.at(4))

    total.appendChild(text)

    //将新的节点追加到父节点哪里

    timeEmt.appendChild(factory)

    timeEmt.appendChild(brand)

    timeEmt.appendChild(price)

    timeEmt.appendChild(number)

    timeEmt.appendChild(total)

}

1、关联Qt库。如果是分别安装的Qt Creator和Qt库,而不是安装集成Qt Creator和Qt库的SDK,则需要手动关联Qt库。打开工具→选项菜单,然后选择“构建和运行”一项,再进入Qt版本选项卡。点击右上角的“添加”按钮,然后会让选择qmake.exe文件,我们在Qt(不是Qt Creator)安装目录的bin目录中郑粗找到该文件并打开。现在已经默认生成了版本信息,我们点击确定按钮即可。

2、关联MinGW。在安装Qt 4.8.6及以后的Qt 4版本时,应该按照安装时的提示来下载相应版本的MinGW,不然编译程序无法运行。如果是Qt4版本,需要使用GCC 4.4,也就是MinGW需要是4.4版本的,其他新的版本均不可用。在Qt 4.8版本,需要下载并指定GDB才能正常调试。下载完MinGW和GDB以后,将其解压到Qt的安装目录中,比如这里都解压到了C:\Qt目录中。打开工具→选项菜单,然后选择“构建和运行”一项,再进入工具链选项卡。点击右上角的“添加”按钮,然后会让选择mingw32-g++.exe文件,我们在MinGW安装目录的bin目录中找到该文件并打开。关联GDB则进入调试器选项卡添加GDB相关exe文件。

如果安装的是集成开发包QtSDK,则不需要手动关联Qt库、MinGW和GDB,由Qt自动关联。

注意:Qt5以后版本默认也包含了所有需要的工具,不存在这里的情况,直接下载安装即可使用!

3、在创建桌面版项目时,最好选中“使用影子构建”,这样编译生成的文件会和源码分别存放,如下图所示。编译完成后会发现多了一个helloworld-build-desktop-Qt_4_8_1__4_8_1____目录,里面存放的就是编译生成的文件。这就是前面创建项目讲到的 “使用影子构建” ,如果没有选中这个,那么生成的文件就会和源码在同一个目录里。

4、补充:如果要给生成的exe可执行文件更换一个自定义图标,可以这样做:

(1)在项目中添加一个myapp.rc(名字可以随意)文件,然后在里面输入下面一行代码:IDI_ICON1               ICON    DISCARDABLE     "appico.ico",这里的appico.ico就是自判丛穗己的.ico图标文件;

(2)在.pro项目文件中添加下面一行代码:RC_FILE = myapp.rc,

(3)重新编译

如果需要更换新的图标,建议先清理项目的编译文件,再重新编译,否则可能会报错,如下。

“:-1: 错误:No rule to make target `..\helloworld\myapp.rc', needed by `debug/myapp_res.o'.  Stop.”

5、在创建主窗口MainWindow项目后,打开mainwindow.ui文件进入设计模式。在这里可以看到界面左上角的“在这里输入”,我们可以在这里添加菜单。双击“在这里输入”,将其更改为“文件(&F)”,然后按下回车键,效果如下图所示。这里的&F表明将菜单的快捷键设置为了Alt+ F,可以看到,实际的显示效果中&符号是隐藏的。

同样的方法,我们在文件菜单中添加“新建(&N)”子菜单,效果如下图所示。菜单后面的那个加号图标是用来创建下一级菜单的。

Qt中的一个菜单被看做是一个Action,我们在下面的Action编辑器中可以看到刚才添加的“新建”菜单,如下图所示。

双击该条目掘卜,会d出编辑动作对话框,这里可以进行各项设置,比如我们可以设置菜单的快捷键,点击一下快捷键后面的行编辑器,然后按下键盘上的Ctrl + N,这样就可以将该菜单的快捷键设置为Ctrl + N。如下图所示。那么大家可能会问,既然该菜单的快捷键是这么设置的,那么前面设置的“新建(N)”中的N是什么呢?这个可以被称为加速键,就是只有当文件菜单处于激活(显示)状态时,按下N键才会执行新建菜单的功能。

6、Qt中可以使用资源文件将各种类型的文件添加到最终生成的可执行文件中,这样就可以避免使用外部文件可能出现的一些问题。而且,在编译时Qt还会将资源文件进行压缩,我们可能发现生成的可执行文件比我们添加到其中的资源文件还要小。创建完资源文件后会自动打开该资源文件,这里需要先在下面添加前缀,就是点击添加按钮,然后选择前缀,默认的前缀是“/new/prefix1”,这个可以随意修改(不要出现中文字符),我们这里因为要添加图片,所以修改为/myImages。然后再按下添加按钮来添加文件,这里最好将所有要用到的图片放到项目目录中。比如我们这里在项目目录中新建了一个images文件夹,然后将需要的图标文件粘贴进去。添加完文件后,如下图所示。

当添加完资源后,一定要按下Ctrl + S来保存资源文件,不然在后面可能无法显示已经添加的资源。

对于添加的资源文件,在项目目录中可以看到,即myResources.qrc,使用写字板程序将其打开,可以发现它其实就是一个XML文档:

<RCC>

<qresourceprefix="/myImages">

<file>images/filenew.png</file>

<file>images/fileopen.png</file>

<file>images/filesave.png</file>

<file>images/filesaveas.png</file>

<file>images/find.png</file>

</qresource>

</RCC>

7、使用代码添加菜单时,在构造函数中添加如下代码:

QAction *openAction = new QAction(QString::fromUtf8("&Open"), this)// 创建新的动作

QIcon icon(":/myImages/images/fileopen.png")// 添加图标

openAction->setIcon(icon)

openAction->setShortcut(QString::fromUtf8("Ctrl+O"))// 设置快捷键

ui->menu_F->addAction(openAction)// 在文件菜单中设置新的打开动作

这里添加图标时,就是使用的资源文件中的图标。使用资源文件,需要在最开始使用冒号,然后添加前缀,后面是文件的路径。在代码中使用文件菜单,就是使用其objectName。大家现在可以运行程序查看效果,当然这里也可以将Open改为中文。

8、向工具栏添加图标:可以将动作编辑器中的动作拖动到工具栏中作为快捷图标使用;可以在工具栏上点击鼠标右键来添加分隔符。

9、使用垂直布局管理器(QVBoxLayout)布局:部件自动垂直排列,并且进行水平拉伸,无论如何改变布局管理器的大小,按钮总是水平方向变化。

使用垂直分裂器(QSplitter)布局:部件自动垂直排列,但进行放大可以发现,使用分裂器按钮纵向是可以变大的,这就是分裂器和布局管理器的重要区别。

10、快速从头文件声明处创建函数定义的方法:到mainwindow.h文件中,将鼠标定位到showFindText()函数上,然后点击右键,在d出的菜单中选择“重构”→“在mainwindow.cpp添加声明”,或者直接使用Alt+Enter快捷键,这样就会直接在mainwindow.cpp文件中添加函数定义,并跳转到该函数处。

11、在QtCreator中有几种快速定位函数的方法:

第一种,在函数声明的地方直接跳转到函数定义的地方。

例如我们在mainwindow.h文件的loadFile()函数上点击鼠标右键,在d出的菜单上选择“在方法声明/定义之间切换”,这时就会自动跳转到mainwindow.cpp文件中该函数的定义处。如下图所示。当然还可以反向使用。

第二种,快速查看一个文件里的所有函数。

可以在编辑器正上方的下拉框里查看正在编辑的文件中所有的函数的列表,点击一个函数就会跳转到指定位置。如下图所示。

第三种,使用类视图或者大纲视图。

在项目列表上面的下拉框中可以更改查看的内容,如果选择为类视图或者大纲,则会显示文件中所有的函数的列表。如下图所示。

第四种,使用查找功能查看函数的所有调用处。

在一个函数名上点击鼠标右键,然后选择“查找何处被使用”菜单,这时就会在下面的搜索结果栏中显示该函数所有的使用位置。我们可以通过点击一个位置来跳转到该位置。如下图所示。

12、在Action编辑器中,有两个属性toolTip和statusTip,分别为工具栏提示和状态栏提示,如下图

这时运行程序,当光标移动到新建动作上时,在下面的工具栏和状态栏将会出现设置的提示。如下图所示

13、状态信息可以被分为三类:临时信息,如一般的statusTip提示信息,上面讲到的动作提示就是临时信息;正常信息,如显示页数和行号;永久信息,如显示版本号或者日期。可以使用showMessage()函数来显示一个临时消息,它会出现在状态栏的最左边。一般用statusBar->addWidget()函数添加一个QLabel到状态栏上用于显示正常信息,它会生成到状态栏的最左边,可能会被临时消息所掩盖。如果要显示永久信息,要使用statusBar->addPermanentWidget()函数来添加一个如QLabel一样的可以显示信息的部件,它会生成在状态栏的最右端,不会被临时消息所掩盖。

14、关于随机数,在Qt中是使用qrand()和qsrand()两个函数实现的。在使用qrand()函数产生随机数之前,一般要使用qsrand()函数为其设置初值,如果不设置初值,那么每次运行程序,qrand()都会产生相同的一组随机数。为了每次运行程序时,都可以产生不同的随机数,我们要使用qsrand()设置一个不同的初值。

楼主,首先纠正一下,QT是一种文件格式,它是由Apple公司开发的一种音频、视频文件格式,用于保存音频和视频信息,具有先进的音频和视频功能,脊羡由包括Apple Mac OS,Microsoft Windows 95/98/NT在内的所有主流计算机 *** 作系统支持。是MAC常用播放软件——Quicktime的主要视频格式之一唤携(其他的还有MOV等),QT文件格式支持25 位彩色,支持RLC、JPEG等领先的集和野伏成压缩技术,提供150多种视频效果。

这个百度上就有,楼主可以搜下。呵呵


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12260073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存