Qt操作ppt文字改变颜色
可以使用QAxObject和QAxWidget类来操作AxtiveX组件,包括word,excel,ppt等。QAxWidget继承自QWidget和QAxBase,QAxObject继承自QObject和QAxBase。他们都从QAxBase继承了大部分与ActiveX相关的功能,特别是dynamicCall()和querySubObject()。
主要用到的方法有:
获取对象时,调用querySubObject()获取一个QAxObject指针。
调用方法时,使用dynamicCall()。
获取某控件属性时,使用property()方法。
设置某控件属性时,使用setProperty()方法。
大部分函数可以直接从VB语言翻译成使用Qt操作AxtiveX的C++语言,因此,开发时可参考微软的开发手册,链接如下:
https://docs.microsoft.com/zh-cn/office/vba/api/overview/
也可以使用此方法打印某一个对象的所有方法,属性等操作手册。但打印出的操作手册有时不全面,建议还是多参考微软的开发手册。
QAxWidget * pfileView = new QAxWidget(this);
pfileView->setControl("Powerpoint.Application")
QString doc = pfileView->generateDocumentation();
QFile outFile("d:/object.html");
outFile.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream ts(&outFile);
ts << doc << endl;
上述代码可以打印出PPT的操作手册作为开发参考。
以下代码为操作PPT查找关键字并标记为黄色的代码。具体过程请参考注释。
bool highLightKeyWordsinPPTFile(QString dirName, QStringList keyWords)
{
//调用PPT进程
QAxWidget wordApplication("Powerpoint.Application");
//获取PPT Presentations对象。
QAxObject *documents = wordApplication.querySubObject("Presentations");
//打开PPT文件
documents->dynamicCall("Open(QString)", dirName);
//获取当前活动的Presentation
QAxObject* m_doc = wordApplication.querySubObject("ActivePresentation"); // 获取当前工作簿
if (m_doc == nullptr)
{
return false;
}
//获取所有幻灯片
QAxObject* pSlides = m_doc->querySubObject("Slides");
if (pSlides != nullptr)
{
//获取幻灯片数量
int val = pSlides->property("Count").toInt();
//遍历每一页幻灯片
for (int i = 1; i <= val; ++i)
{
//获取每一页幻灯片
QAxObject* pItem = pSlides->querySubObject("Item(const QVariant&)", QVariant(i));
if (pItem != nullptr)
{
//获取每一页幻灯片的所有shape,我理解是图形控件
QAxObject* pRange = pItem->querySubObject("Shapes");
if (pRange != nullptr)
{
//获取shape的数量
int iShape = pRange->property("Count").toInt();
//遍历每一个shape,去查找对应的文本有没有包含关键字
for (int j = 1; j <= iShape; ++j)
{
//获取一个shape对象
QAxObject* pShape = pRange->querySubObject("Item(const QVariant&)", QVariant(j));
if (pShape != nullptr)
{
//获取文本框
QAxObject* pTextFrame = pShape->querySubObject("TextFrame");
if (pTextFrame != nullptr)
{
//获取文本范围
QAxObject* pTextRange = pTextFrame->querySubObject("TextRange");
if (pTextRange != nullptr)
{
for (int keyWord = 0; keyWord < keyWords.size(); ++keyWord)
{
//将每一个关键词或字使用find方法查找,如果有结果,即返回对象不为空,即是需要高亮的文本
QAxObject* pTextRes = pTextRange->querySubObject("Find(string,long,int,int)", keyWords[keyWord], 0, -1, -1);
if (pTextRes != nullptr)
{
//获取需要标记的文本的字体
QAxObject* pTextFont = pTextRes->querySubObject("Font");
if (pTextFont != nullptr)
{
//获取字体的颜色
QAxObject* pTextColor = pTextFont->querySubObject("Color");
if (pTextColor != nullptr)
{
//将颜色设置为0X00FFFF
pTextColor->setProperty("RGB", 0X00FFFF);
delete pTextColor;
}
delete pTextFont;
}
delete pTextRes;
}
}
delete pTextRange;
}
delete pTextFrame;
}
delete pShape;
}
}
delete pRange;
}
delete pItem;
}
}
delete pSlides;
}
//保存该文档
m_doc->dynamicCall("SaveAs(const QString)", m_ dirName);
//关闭文档
m_doc->dynamicCall("Close()");
delete m_doc;
//退出ppt进程
wordApplication.dynamicCall("Quit ()");
return true;
}