QT读取注册表总结
问题:使用QSettings时,对于注册表中类似于串口信息中的\Device\Serial0的这种key值,用value()函数无法读到其value。
分析:QT在读取注册表时,对于有路径分隔符“\”“/”的value都无法读取,应该属于QT的一个小bug。
解决方法:
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include<QWidget>
#include<QMessageBox>
#include<qt_windows.h>
#include<QSettings>
#include<QtGui/QMainWindow>
namespace Ui{
class Widget;
}
class Widget:public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget*parent=0);
~Widget();
private:
Ui::Widget*ui;
QStringList m_listcomboName;
HKEY hKey;
LPCWSTR subkey;
wchar_t keyname[256];//键名数组
char keyvalue[256];//键值数组
DWORD keysize,type,valuesize;
int indexnum;
public:
QString getcomm(int index,QString keyorvalue);//读取键名
};
#endif//WIDGET_H
.cpp 文件
#include"widget.h"
#include"ui_widget.h"
Widget::Widget(QWidget*parent):
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QString path="HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
QSettings*settings=new QSettings(path,QSettings::NativeFormat);
QStringList key=settings->allKeys();
int num=(int)key.size();
QString value;
for(int i=0;i<num;i++)
{
value=getcomm(i,"value");
m_listcomboName<<value;
}
}
Widget::~Widget()
{
delete ui;
}
QString Widget::getcomm(int index,QString keyorvalue)
//index为索引号,keyorvalue为选择返回值应该为key还是value
{
QString commresult;
if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),0, KEY_READ,&hKey)!=0)
{
QString error="Cannot open regedit!";//无法打开注册表时返回error
return error;
}//if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0)
QString keymessage;//键名
QString message;
QString valuemessage;//键值
indexnum=index;//要读取键值的索引号
keysize=sizeof(keyname);
valuesize=sizeof(keyvalue);
if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&value size)==0)//列举键名和值
{
for(int i=0;i<keysize;i++)
{
message=keyname[i];
keymessage.append(message);
}//for(int i=0;i<=keysize;i++)读取键名
for(int j=0;j<valuesize;j++)
{
if(keyvalue[j]!=0x00)
{
valuemessage.append(keyvalue[j]);
}
}//for(int j=0;j<valuesize;j++)读取键值
if(keyorvalue=="key")
{
commresult=keymessage;
}
if(keyorvalue=="value")
{
commresult=valuemessage;
}
}
else
{
commresult="nokey";
}
//if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&val uesize)==0)列举键名和值
return commresult;
::RegCloseKey(hKey);//关闭注册表
}。
Qt_QSetting读写注册表
Qt利用QSetting读写注册表。
Windows的注册表格式分为根键、子键、键、值四种元素。
根键为最起始的计算机(“/”)。
根键下有五大子键。
每个子键下有下属子键、键、值。
键、值以键值对的形式存在,一个键对应一个值。
每个子键可以有0个或多个键值对。
1. QSettings *reg = new QSettings("HKEY_CURRENT_USER\\Software\\yinhaifan",2. QSettings::NativeFormat);3. reg->setValue("registered",true);4. delete reg;上述1、2代码为创建一个子键。
3代码为创建一个键值对。
1.QSettings *reg = new QSettings("HKEY_CURRENT_USER\\Software\\yinhaifan",2. QSettings::NativeFormat);3.if (reg->value("registered",false).toBool())4.{5. QMessageBox::information(NULL,"information","registered");6.}7.delete reg;上述1、2代码为创建一个子键。
(子键存在则指向已存在的子键)。
3代码为判断读取键值对是否成功。
W7下会涉及到修改注册表的管理者权限问题。
一个解决办法如下。
所以就以“管理员权限”运行qt creator。
在Creator中运行编译后的exe文件,成功的修改了注册表。
realese时,先生成exe文件。
再使用win SDK的mt.exe工具把修改后的manifest打包到exe文件中。
这时exe文件会被加上一个盾牌的图标,win7启动它时,会自动弹出确认框,让用户授予管理员权限。
qsettings注册表操作的使用方法
qsettings注册表操作的使用方法QSettings类是Qt框架中用于访问和修改应用程序设置的类。
它提供了对注册表和INI文件的操作接口。
下面是使用QSettings进行注册表操作的一般方法:1. 导入必需的模块:```cpp#include <QSettings>```2. 创建QSettings对象:```cppQSettingssettings("HKEY_CURRENT_USER\\Software\\MyApp", QSettings::NativeFormat);```这里的第一个参数是指定注册表中的路径,第二个参数是指定保存设置的格式。
可以使用"NativeFormat"来自动选择正确的格式。
3. 读取和修改注册表中的值:```cppQString value = settings.value("KeyPath/ValueName", "DefaultValue").toString();settings.setValue("KeyPath/ValueName", "NewValue");```上面的代码演示了如何读取和修改注册表中的某个键值对。
第一个参数是指定注册表中的键值对的路径,第二个参数是在没有找到对应的键值对时返回的默认值。
4. 删除注册表中的键值对:```cppsettings.remove("KeyPath/ValueName");```使用remove()函数可以从注册表中删除指定的键值对。
请注意,在Windows操作系统中,QSettings默认会将注册表中的更改写入到“HKEY_CURRENT_USER\Software\OrganizationName\Organiz ationDomain\Appli cationName”路径下的注册表键值对中。
qt数据库操作总结
qt数据库操作总结整理⼀下 QT 操作数据库的⼀些要点,以备以后的查询学习(主要是操作 mysql )。
⾸先,要查询相关的驱动是否已经装好了,可以⽤以下的程序进⾏验证:#include <QtCore/QCoreApplication>#include <QSqlDatabase>#include <QDebug>#include <QStringList>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);qDebug()<<"Available drivers:";QStringList drivers = QSqlDatabase::drivers();foreach(QString driver, drivers)qDebug() <<"/t" << driver;return a.exec();}结果如下:接着是连接数据库:#include <QtGui/QApplication>#include <QtGui>#include <QtSql>bool createConnection(){QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setDatabaseName("test");db.setUserName("root");db.setPassword("123456");bool ok = db.open();if(!ok){QMessageBox::critical(0, QObject::tr(" 连接数据库失败 "), stError().text());return false;}else{QMessageBox::information(0, QObject::tr("Tips"), QObject::tr(" 连接数据库成功 "));}}int main(int argc, char *argv[]){QApplication a(argc, argv);QTextCodec *codec= QTextCodec::codecForName("GB2312"); QTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec);if(!createConnection())return 1;return a.exec();}结果如下:插⼊操作://ODBC 数据库表⽰⽅式QSqlQuery query;query.prepare( “insert into student (id, name) ”“values (:id, :name) ”);query.bindValue(0, 5);query.bindValue(1, “sixth ”);query.exec();//Oracle 表⽰⽅式query.prepare( “insert into student (id, name) ”“values (?, ?) ”);query.bindValue(0, 5);query.bindValue(1, “sixth ”);query.exec();// 使⽤ addBindValue() 函数,省去了编号,它是按属性顺序赋值的query.prepare( “insert into student (id, name) ”“values (?, ?) ”);query.addBindValue(5);query.addBindValue( “sixth ”);query.exec();// 使⽤ ODBC ⽅法时,可以将编号⽤实际的占位符代替query.bindValue( “:id ”, 5);query.bindValue( “:name ”, “sixth ”);query.exec();注意:最后⼀定要执⾏ exec() ,否则上⾯的语句是不会被执⾏的。
QtQSettings读取注册表和ini
QtQSettings读取注册表和iniQt QSettings读取注册表和ini分类: Qt4 2012-09-07 15:10 2536人阅读评论(1) 收藏举报qtmicrosoftwindowsinic1.读取注册表,以读取已经安装的软件为例。
已经安装的软件信息的注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Cu rrentVersion\Uninstall[cpp] view plaincopy?1.void Widget::initSoftWareList()2.{3.softWareCount=0;4.softWareList=new QListWidget;5.softWareList->setFrameShape(QFrame::NoFrame);6.QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\Mic rosoft\\Windows\\CurrentVersion\\Uninstall",QSettings::NativeF ormat);7.QStringList groupsList=reg.childGroups();8.foreach(QString group,groupsList)9.{10.reg.beginGroup(group);11.QString softWareName=reg.value("DisplayName").toS tring();12.if(!softWareName.isEmpty())13.{14.softWareList->addItem(new QListWidgetItem(softWar eName));15.softWareCount++;16.}17.reg.endGroup();18.}19.}主要是要分清childGroups和childKeys。
一周Qt使用小结
一周Qt使用小结收藏此文于2011-03-28被推荐到CSDN首页如何被推荐?初创公司,没有像大公司那样的技术积累,很多东西需要自己从头干起,其中较大的一块就是工具。
想起刚刚参加工作半年的那会儿,老板为了说服我写工具,说让我进工具组是培养我,写了一个数据校验工具后,我就死活再也不肯开发工具了,硬要继续写服务端程序。
现在真是轮回,这次我是发现,我们实在是太需要工具了,于是决定自己写工具来提高公司的游戏开发效率。
于是,首先用本周时间,开发了一个用于编辑游戏layout的工具,使用的UI库是Qt。
这个虽然是在公司有在MacOS下使用工具的需求下做出的选择,但是还是不得不说,对比3年前学习和使用MFC的经历,总体来说是心情愉快了很多。
Qt的学习断断续续,虽然我的博客中有个Qt的分类,但是在之前其实了解的还是比较浅的,除了大概翻看过《C++ GUI Qt 4编程》(第二版)一书,用Qt结合OpenGL做了一些小的动画demo,基本没有开发过啥实际的东西。
说起来这还是第一次在工作中使用到Qt,中间多少还是走了一些弯路,也碰到过一些问题,这里大概总结一下,想到哪就说到哪了。
很难避免要说的是与MFC的比较,但是我前面说了,我们公司用MacOS的人较多,跨平台是硬指标,MFC无法选择。
至于其他类似的跨平台库wx等的选择,见以前的文章。
就中国目前的国情,已经自己较低的水平,为了避免口水站,这部分就省略了。
就使用体验来说,Qt的确比MFC的设计好了很多,因为Qt原来就是个靠卖库生存的公司,库和API的设计就是公司的核心竞争力,要是设计的不好,公司就没法生存了。
所以感觉API的设计上的确是花了很多功夫的。
(参考这个文章)signal/slot系统的存在的确让设计灵活了很多,开发的过程中甚至都能让思维更加一致和清楚,因为你在设计和使用某个类时,完全可以暂时不考虑其他类。
(这是理想情况)设计时假如有模块化的思想,signal/slot可以很方便的用于模块间的解耦。
qt程序中中获取系统位数的方法
qt程序中中获取系统位数的方法1.引言1.1 概述在编写Qt程序时,有时我们需要根据系统的位数来进行一些特定的操作或适配。
系统位数指的是操作系统所使用的CPU的位数,常见的有32位和64位系统。
在很多情况下,我们需要判断当前系统的位数,以便选择合适的操作方式或库文件。
本文将介绍在Qt程序中获取系统位数的方法,帮助读者更好地理解和处理这一问题。
文章接下来将分为引言、正文和结论三个部分。
引言部分将对本文的主题进行概述和说明,正文部分将介绍什么是系统位数,并详细讲解获取系统位数的方法。
最后,在结论部分将对整篇文章进行总结,并展望未来在Qt程序开发中的应用前景。
接下来,我们将逐一介绍本文的各个部分,希望读者能够通过本文对Qt程序中获取系统位数的方法有一个全面而深入的了解。
文章结构是指文章的组织框架和段落安排。
一个良好的文章结构能够帮助读者更好地理解和跟随文章的内容。
本文将按照以下结构展开:1. 引言1.1 概述:介绍Qt程序中获取系统位数的需求和重要性。
1.2 文章结构:阐述本文的组织框架和段落安排。
1.3 目的:明确本文的目标和意义。
2. 正文2.1 什么是系统位数:解释系统位数的定义和作用。
2.2 获取系统位数的方法:详细介绍获取系统位数的多种方法,包括从注册表、环境变量、系统API等方面进行获取。
3. 结论3.1 总结:对文章的主要内容进行总结,并重申获取系统位数的重要性。
3.2 结果展望:展望未来,探讨更多关于系统位数获取的发展趋势和可能的改进方法。
通过这样的文章结构,读者可以清晰地了解到本文的框架和内容安排,帮助他们更好地理解和解答关于Qt程序中获取系统位数的问题。
1.3 目的本文的目的是介绍在Qt程序中如何获取系统的位数。
随着计算机技术的发展,不同系统的位数也有所区别,例如32位和64位。
在开发过程中,获取系统的位数是一项非常重要的任务,特别是当我们需要根据系统位数来选择合适的库、组件或者进行一些相应的配置时。
QT读取注册表总结
问题:使用QSettings时,对于注册表中类似于串口信息中的\Device\Serial0的这种key值,用value()函数无法读到其value。
分析:QT在读取注册表时,对于有路径分隔符“\”“/”的value都无法读取,应该属于QT的一个小bug。
解决方法:.h文件#ifndef WIDGET_H#define WIDGET_H#include<QWidget>#include<QMessageBox>#include<qt_windows.h>#include<QSettings>#include<QtGui/QMainWindow>namespace Ui{class Widget;}class Widget:public QWidget{Q_OBJECTpublic:explicit Widget(QWidget*parent=0);~Widget();private:Ui::Widget*ui;QStringList m_listcomboName;HKEY hKey;LPCWSTR subkey;wchar_t keyname[256];//键名数组char keyvalue[256];//键值数组DWORD keysize,type,valuesize;int indexnum;public:QString getcomm(int index,QString keyorvalue);//读取键名};#endif//WIDGET_H.cpp 文件#include"widget.h"#include"ui_widget.h"Widget::Widget(QWidget*parent):QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);QString path="HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\";QSettings*settings=new QSettings(path,QSettings::NativeFormat);QStringList key=settings->allKeys();int num=(int)key.size();QString value;for(int i=0;i<num;i++){value=getcomm(i,"value");m_listcomboName<<value;}}Widget::~Widget(){delete ui;}QString Widget::getcomm(int index,QString keyorvalue)//index为索引号,keyorvalue为选择返回值应该为key还是value{QString commresult;if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),0, KEY_READ,&hKey)!=0){QString error="Cannot open regedit!";//无法打开注册表时返回errorreturn error;}//if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0)QString keymessage;//键名QString message;QString valuemessage;//键值indexnum=index;//要读取键值的索引号keysize=sizeof(keyname);valuesize=sizeof(keyvalue);if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&value size)==0)//列举键名和值{for(int i=0;i<keysize;i++){message=keyname[i];keymessage.append(message);}//for(int i=0;i<=keysize;i++)读取键名for(int j=0;j<valuesize;j++){if(keyvalue[j]!=0x00){valuemessage.append(keyvalue[j]);}}//for(int j=0;j<valuesize;j++)读取键值if(keyorvalue=="key"){commresult=keymessage;}if(keyorvalue=="value"){commresult=valuemessage;}}else{commresult="nokey";}//if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&val uesize)==0)列举键名和值return commresult;::RegCloseKey(hKey);//关闭注册表}。
qt编程总结
QT编程总结一、概述QT是一款跨平台的图形用户界面(GUI)开发框架,可以用于开发各种应用程序,特别适用于开发桌面应用程序。
本文将对QT编程进行总结,包括QT的基本知识、常用控件的使用、信号与槽机制以及界面布局等方面进行介绍。
二、QT基本知识1. QT的安装与配置QT可以从官方网站下载并进行安装,安装完毕后需要对开发环境进行配置。
在配置过程中,我们需要添加QT的路径到系统环境变量中,以便能够在命令行中正常使用QT命令和工具。
2. QT的项目结构QT项目包含一个.pro文件以及若干源文件和资源文件。
.pro文件是QT项目的核心文件,用于描述项目的编译配置以及依赖关系。
源文件通常使用.cpp扩展名,资源文件通常使用.qrc扩展名。
3. QT的编译与运行QT提供了一个跨平台的编译工具qmake,可以根据.pro文件生成相应的Makefile,然后使用make命令进行编译。
编译完成后,可以使用命令行运行生成的可执行文件,也可以在QT Creator中直接运行。
三、常用控件的使用1. QLabelQLabel用于显示文本或图像,并允许在文本或图像上添加链接和悬停效果。
我们可以通过设置QLabel的文本、字体、大小、颜色等属性来定制标签的外观。
2. QPushButtonQPushButton是一个常见的按钮控件,可以用于捕捉用户的点击操作。
我们可以通过设置QPushButton的文本、图标、大小、样式等属性来定制按钮的外观。
同时,可以使用信号与槽机制来响应按钮的点击事件。
3. QLineEditQLineEdit是一个用于接收用户输入的文本框控件。
可以设置QLineEdit的默认文本、占位符文本、大小、样式等属性来定制文本框的外观。
四、信号与槽机制在QT中,信号与槽机制用于对象之间的通信。
信号是对象发出的消息,槽是用于处理信号的函数。
当一个对象的信号被发出时,与之相连接的槽函数会被调用。
通过信号与槽的连接,可以实现对象之间的解耦和灵活的通信。
电脑开机时出现无法读取注册表如何解决
电脑开机时出现无法读取注册表如何解决在使用电脑的过程中,我们可能会遇到各种各样的问题,其中电脑开机时出现无法读取注册表的情况就比较令人头疼。
注册表对于Windows 操作系统来说至关重要,它存储着系统和应用程序的关键配置信息。
当出现无法读取注册表的错误时,可能会导致系统无法正常启动、某些功能无法使用或者出现不稳定的情况。
接下来,让我们一起深入探讨这个问题,并寻找有效的解决方法。
首先,我们需要了解一下为什么会出现无法读取注册表的情况。
这可能是由于注册表文件损坏、权限问题、病毒或恶意软件感染、硬件故障等多种原因引起的。
注册表文件损坏是比较常见的原因之一。
在系统的运行过程中,由于突然断电、非法关机、软件冲突等因素,可能会导致注册表文件出现错误或损坏。
这种情况下,系统在开机时就无法正确读取注册表信息。
权限问题也可能导致无法读取注册表。
如果当前用户没有足够的权限访问注册表的某些关键区域,就会出现读取失败的情况。
病毒或恶意软件感染也是一个不容忽视的因素。
它们可能会篡改注册表的内容,或者破坏注册表文件,从而导致无法读取。
硬件故障,如硬盘损坏、内存问题等,也有可能影响到注册表的读取。
那么,当我们遇到电脑开机时无法读取注册表的问题时,应该如何解决呢?第一步,我们可以尝试使用系统自带的工具进行修复。
Windows 系统通常提供了一些内置的工具,如系统文件检查器(SFC)和 DISM 工具。
系统文件检查器(SFC)可以扫描并修复系统文件的错误。
我们可以通过以下步骤来运行 SFC 工具:按下“Windows 键+X”,选择“命令提示符(管理员)”,在命令提示符窗口中输入“sfc /sca nnow”并按下回车键。
系统会开始扫描并修复损坏的系统文件,包括可能受损的注册表文件。
DISM 工具(部署映像服务和管理工具)则可以用于修复系统映像和组件存储的问题。
同样以管理员身份运行命令提示符,输入“DISM /Online /CleanupImage /RestoreHealth”并回车,等待修复完成。
QtExcel进行新增、删除、修改读取从入门到精通
QtExcel进⾏新增、删除、修改读取从⼊门到精通配置xxx.pro引⼊Active Qt库QT += axcontainer引⼊objbase.h,解决返回QAxObject为空的问题1 #include <objbase.h>23//在需要创建QAxObject()上⽅调⽤如下代码4 CoInitializeEx(NULL, COINIT_MULTITHREADED);5 m_pExcel = new(std::nothrow) QAxObject();因为QAxObject默认是在单线程下使⽤的,因此如果不⽤上门代码申明多线程, 会导致获取的excel的QAxObject都是NULL保存或者打开excel的路径需要统⼀⽤"\"⽤QDir::toNativeSeparators(m_strPath)进⾏转换m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));SaveAs必须在所有操作结束后调⽤,否则不会保存到excel中可以放到close前调⽤即可1 m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));2 m_pWorkbook->dynamicCall("Close()");3 m_pExcel->dynamicCall("Quit()");4delete m_pExcel;5 m_pExcel = NULL;Demo1 #ifndef EXCELOPERATOR_H2#define EXCELOPERATOR_H34 #include <QObject>5 #include <ActiveQt/QAxObject>6 #include <QDebug>7 #include <QDir>89class ExcelOperator : public QObject10 {11 Q_OBJECT12public:13explicit ExcelOperator(QObject *parent = nullptr);14 ~ExcelOperator();15//打开⽂件16bool open(QString path);17//关闭⽂件18bool close();19//获取⼯作表数量20int getSheetsCount();21//根据名称创建⼯作表22 QAxObject* addSheet(QString name);23//根据名称删除⼯作表24bool delSheet(QString name);25//根据编号删除⼯作表26bool delSheet(int index);27//根据名称获取⼯作表28 QAxObject* getSheet(QString name);29//根据编号获取⼯作表30 QAxObject* getSheet(int index);31//获取⾏对象32 QAxObject* getRows(QAxObject* pSheet);33//获取⾏数34int getRowsCount(QAxObject* pSheet);35//获取列对象36 QAxObject* getColumns(QAxObject* pSheet);37//获取列数38int getColumnsCount(QAxObject* pSheet);39//根据⾏列值获取单元格值, 如: 3⾏,5列40 QString getCell(QAxObject* pSheet, int row, int column);41//根据⾏列编号获取单元格值, 如: "F6"42 QString getCell(QAxObject* pSheet, QString number);43//根据⾏列值设置单元格值44bool setCell(QAxObject* pSheet, int row, int column, QString value);45//根据⾏列编号设置单元格值46bool setCell(QAxObject* pSheet, QString number, QString value);474849 signals:5051public slots:52private:53 QAxObject* m_pExcel;54 QAxObject* m_pWorksheets;55 QAxObject* m_pWorkbook;56 QString m_strPath;57 };5859#endif// EXCELOPERATOR_H1 #include "exceloperator.h"2 #include <objbase.h>34 ExcelOperator::ExcelOperator(QObject *parent) : QObject(parent)5 , m_pExcel(NULL)6 , m_pWorksheets(NULL)7 , m_pWorkbook(NULL)8 {910 }1112 ExcelOperator::~ExcelOperator()13 {14 close();15 }1617bool ExcelOperator::open(QString path)18 {19 m_strPath = path;20 QAxObject *pWorkbooks = NULL;21 CoInitializeEx(NULL, COINIT_MULTITHREADED);22 m_pExcel = new(std::nothrow) QAxObject();23if (NULL == m_pExcel) {24 qCritical()<<"创建Excel对象失败...";25return false;26 }27try {28 m_pExcel->setControl("Excel.Application");29 m_pExcel->dynamicCall("SetVisible(bool)", false); //true 表⽰操作⽂件时可见,false表⽰为不可见30 m_pExcel->setProperty("DisplayAlerts", false);31 pWorkbooks = m_pExcel->querySubObject("WorkBooks");32 pWorkbooks->dynamicCall("Add");33 m_pWorkbook = m_pExcel->querySubObject("ActiveWorkBook");34 qDebug()<<"excel path: "<<m_strPath;3536// 获取打开的excel⽂件中所有的⼯作sheet37 m_pWorksheets = m_pWorkbook->querySubObject("WorkSheets");38 } catch (...) {39 qCritical()<<"打开⽂件失败...";40return false;41 }4243return true;44 }4546bool ExcelOperator::close()47 {48 qDebug()<<"excel close...";49if (m_pExcel)50 {51 qDebug()<<"closing...";52 m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));53 m_pWorkbook->dynamicCall("Close()");54 m_pExcel->dynamicCall("Quit()");55delete m_pExcel;56 m_pExcel = NULL;57 }58return true;59 }6061int ExcelOperator::getSheetsCount()62 {63int count = 0;64 count = m_pWorksheets->property("Count").toInt();65return count;66 }676869 QAxObject* ExcelOperator::addSheet(QString name)70 {71 QAxObject *pWorkSheet = NULL;72try {73int count = m_pWorksheets->property("Count").toInt(); //获取⼯作表数⽬74 QAxObject *pLastSheet = m_pWorksheets->querySubObject("Item(int)", count);75 pWorkSheet = m_pWorksheets->querySubObject("Add(QVariant)", pLastSheet->asVariant());76 pLastSheet->dynamicCall("Move(QVariant)", pWorkSheet->asVariant());77 pWorkSheet->setProperty("Name", name); //设置⼯作表名称78 } catch (...) {79 qCritical()<<"创建sheet失败...";80 }81return pWorkSheet;82 }8384bool ExcelOperator::delSheet(QString name)85 {86try {87 QAxObject *pFirstSheet = m_pWorksheets->querySubObject("Item(QString)", name);88 pFirstSheet->dynamicCall("delete");89 } catch (...) {90 qCritical()<<"删除sheet失败...";91return false;92 }93return true;94 }9596bool ExcelOperator::delSheet(int index)97 {98try {99 QAxObject *pFirstSheet = m_pWorksheets->querySubObject("Item(int)", index); 100 pFirstSheet->dynamicCall("delete");101 } catch (...) {102 qCritical()<<"删除sheet失败...";103return false;104 }105return true;106 }107108 QAxObject* ExcelOperator::getSheet(QString name)109 {110 QAxObject* pWorkSheet = NULL;111try {112 pWorkSheet = m_pWorksheets->querySubObject("Item(QString)", name); 113 } catch (...) {114 qCritical()<<"获取sheet失败...";115 }116return pWorkSheet;117 }118119 QAxObject* ExcelOperator::getSheet(int index)120 {121 QAxObject* pWorkSheet = NULL;122try {123 pWorkSheet = m_pWorksheets->querySubObject("Item(int)", index);124 } catch (...) {125 qCritical()<<"获取sheet失败...";126 }127return pWorkSheet;128 }129130 QAxObject* ExcelOperator::getRows(QAxObject* pSheet)131 {132 QAxObject* pRows = NULL;133try {134 pRows = pSheet->querySubObject("Rows");135 } catch (...) {136 qCritical()<<"获取⾏失败...";137 }138return pRows;139 }140141int ExcelOperator::getRowsCount(QAxObject* pSheet)142 {143int rows = 0;144try {145 QAxObject* pRows = getRows(pSheet);146 rows = pRows->property("Count").toInt();147 } catch (...) {148 qCritical()<<"获取⾏数失败...";149 }150return rows;151 }152153 QAxObject* ExcelOperator::getColumns(QAxObject* pSheet)154 {155 QAxObject* pColumns = NULL;156try {157 pColumns = pSheet->querySubObject("Columns");158 } catch (...) {159 qCritical()<<"获取列失败...";160 }161return pColumns;162 }163164int ExcelOperator::getColumnsCount(QAxObject* pSheet)165 {166int columns = 0;167try {168 QAxObject* pColumns = getColumns(pSheet);169 columns = pColumns->property("Count").toInt();170 } catch (...) {171 qCritical()<<"获取列数失败...";172 }173return columns;174 }175176 QString ExcelOperator::getCell(QAxObject* pSheet, int row, int column)177 {178 QString strCell = "";179try {180 QAxObject* pCell = pSheet->querySubObject("Cells(int, int)", row, column); 181 strCell = pCell->property("Value").toString();182 } catch (...) {183 qCritical()<<"获取单元格信息失败...";184 }185186return strCell;187 }188189 QString ExcelOperator::getCell(QAxObject* pSheet, QString number)190 {191 QString strCell = "";192try {193 QAxObject* pCell = pSheet->querySubObject("Range(QString)", number); 194 strCell = pCell->property("Value").toString();195 } catch (...) {196 qCritical()<<"获取单元格信息失败...";197 }198199return strCell;200 }201202bool ExcelOperator::setCell(QAxObject* pSheet, int row, int column, QString value) 203 {204try {205 QAxObject* pCell = pSheet->querySubObject("Cells(int, int)", row, column); 206 pCell->setProperty("Value", value);207 } catch (...) {208 qCritical()<<"写⼊单元格信息失败...";209return false;210 }211return true;212 }213214bool ExcelOperator::setCell(QAxObject* pSheet, QString number, QString value) 215 {216try {217 QAxObject* pCell = pSheet->querySubObject("Range(QString)", number); 218 pCell->setProperty("Value", value);219 } catch (...) {220 qCritical()<<"写⼊单元格信息失败...";221return false;222 }223return true;224 }。
