QT中关于书签的操作

书签的基础操作

// 通过标签名来获得指定标签对象
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 &paragraph)
{
    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.

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Qt是一个跨平台的C++开发框架,提供了许多操作文件和表格的函数和类。要使用Qt操作Excel表格的书签,需要先安装并配置Qt的相关库。 首先,需要在Qt引入相关的库。Qt提供了QAxObject类,用于操作COM组件。在Qt项目,需要在.pro文件添加`QT += axcontainer`以引入该库。 接下来,可以使用QAxObject的相关函数来读写Excel表格书签。首先,需要创建QAxObject对象,并调用其setControl函数来指定COM组件。在这里,我们需要指定Excel的COM组件: ```cpp QAxObject* excel = new QAxObject("Excel.Application"); ``` 然后,可以使用QAxObject的函数打开Excel表格,并获取工作簿和工作表: ```cpp QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filePath); QAxObject* sheets = workbook->querySubObject("Worksheets"); QAxObject* sheet = sheets->querySubObject("Item(int)", sheetIndex); ``` 在获取到工作表后,可以使用QAxObject的相应函数操作Excel表格书签。具体的操作方法和函数,请参考Microsoft Excel的官方文档。 最后,记得在使用完Excel后,调用相应的销毁函数来释放资源: ```cpp sheet->dynamicCall("Close()"); excel->dynamicCall("Quit()"); delete excel; ``` 这样,就可以使用Qt操作Excel表格书签了。需要注意的是,要确保计算机上安装了Microsoft Office并启用了相关功能。并且,在使用COM组件时要及时关闭和释放资源,以避免资源泄露。 总的来说,使用Qt操作Excel表格书签需要引入QAxObject类,并进行相应的函数调用。遵循以上步骤,可以顺利地读写Excel表格书签

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值