书签的基础操作
// 通过标签名来获得指定标签对象
QAxObject *pBookMarkCode = m_document->querySubObject("Bookmarks(QVariant)", name);
// 通过标签名的位置顺序获得标签对象
QAxObject *pBookMarkCode = m_document->querySubObject("Bookmarks(QVariant)", 1);//获得第一个标签
// 选择指定标签(说实话不知道干啥的)
pBookMarkCode->dynamicCall("Select(void)");
// 获得书签位置顺序
pBookMarkCode->querySubObject("Range")->property("BookmarkID").toInt();
// 获得书签名字
pBookMarkCode->property("Name").toString();
书签的增删改查
// 新建一个书签,位置是当前光标所在位置
void WordManage::insertBookMark(const QString &name, int type, int count)
{
// 获取所有的书签
QAxObject *pBookMarkCode = m_document->querySubObject("Bookmarks");
QList<QVariant> list;
list << name << m_word->querySubObject("Selection")->property("Range");
// 新建书签
pBookMarkCode->dynamicCall("Add(QString, QVariant)", list);
// 该行代码是书签明和书签信息存储到二叉树中,主要用于获得书签内容的长度
m_markMap.insert(name, TagInformation(Coordinate(currentRow(), currentCol()),
type, count));
}
// 删除一个书签,参数就是需要删除书签的名字,该函数会连同内容和书签都删除的
void WordManage::deleteBookMark(const QString &name)
{
if(m_document == nullptr)
{
return;
}
// 获取所有标签
QAxObject *pBookMarkCode = m_document->querySubObject("Bookmarks");
// 如果不存在,就告诉客户
if(!pBookMarkCode->dynamicCall("Exists(QString)", name).toBool())
{
qDebug() << "please input existed bookmark";
return;
}
// 获取指定名称的书签
QAxObject *bookMarkToBeDel = m_document->querySubObject("Bookmarks(QVariant)", name);
if(bookMarkToBeDel)
{
// 选择该书签
bookMarkToBeDel->dynamicCall("Select(void)");
// 选择当前Active的Pane(如果什么也没有选中,那么就是一个竖线---对应书签的位置)
QAxObject* selection = m_word->querySubObject("Selection");
// 扩大选中的范围
QList<QVariant> mylist;
mylist << 1 << m_markMap[name].getCount() << 0;
selection->dynamicCall("MoveRight(QVariant, QVariant, QVariant)", mylist);
// 删除这个范围中的内容(这里是文本内容)
selection->dynamicCall("Delete(QVariant, QVariant)", mylist);
// 删除标签对象,按照我想象的应该有,实际上,没有并没有产生什么错误
// bookMarkToBeDel->dynamicCall("Delete(void)");
}
return;
}
void WordManage::updateBookMark(const QString &tag, const QString ¶graph)
{
if(m_document == nullptr)
{
return;
}
// 请求所有的标签
QAxObject *pBookMarkCode = m_document->querySubObject("Bookmarks");
// 判断是否存在
if(!pBookMarkCode->dynamicCall("Exists(QString)", tag).toBool())
{
qDebug() << "please input existed bookmark";
return;
}
// 获取指定标签
QAxObject *bookMarkToBeUpdate = m_document->querySubObject("Bookmarks(QVariant)", tag);
if(bookMarkToBeUpdate)
{
bookMarkToBeUpdate->dynamicCall("Select(void)");
// 获得选中的内容
QAxObject* selection = m_word->querySubObject("Selection");
TagInformation &tagInfo = m_markMap[tag];
QList<QVariant> mylist;
mylist << tagInfo.getType() << tagInfo.getCount();
selection->dynamicCall("Delete(QVariant, QVariant)", mylist);
selection->dynamicCall("InsertAfter(QString)", paragraph);
tagInfo.setType(TagInformation::TagType::wdCharacter);
tagInfo.setCount(paragraph.size());
}
// 不知道为何通过上面的操作将会把标签删除掉,因此在这里添加上
insertBookMark(tag);
return;
}
QString WordManage::queryBookMark(const QString &tag)
{
if(m_document == nullptr)
{
return "";
}
QAxObject *pBookMarkCode = m_document->querySubObject("Bookmarks");
if(!pBookMarkCode->dynamicCall("Exists(QString)", tag).toBool())
{
qDebug() << "please input existed bookmark";
return "";
}
QAxObject *bookMarkToBeDel = m_document->querySubObject("Bookmarks(QVariant)", tag);
if(bookMarkToBeDel)
{
bookMarkToBeDel->dynamicCall("Select(void)");
QAxObject* selection = m_word->querySubObject("Selection");
QList<QVariant> mylist;
mylist << 1 << 0;
// 官方有这个操作,加了该行代码就会抛异常,注释掉后没有发现问题
// selection->dynamicCall("HomeKey(QVariant, QVariant)", mylist);
mylist.clear();
mylist << m_markMap[tag].getType() << m_markMap[tag].getCount() << 0;
selection->dynamicCall("MoveRight(QVariant, QVariant, QVariant)", mylist);
//qDebug() << "in function " << selection->property("Text").toString();
return selection->property("Text").toString();
}
return "";
}
m_word->querySubObject("Selection");
Use the Selection property to return the Selection object. If no object qualifier is used with the Selection property, Microsoft Word returns the selection from the active pane of the active document window.