Qt操作ppt文字改变颜色

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;
}

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值