第四十一课、编辑交互功能的实现------------------狄泰软件学院

本文详细介绍了如何在Qt环境中使用QPlainTextEdit进行文本编辑交互,包括利用其丰富的接口和信号槽机制。同时,文章强调了界面状态管理的重要性,特别是对于复制、粘贴、撤销和重做功能的条件判断。通过信号标志,实现了根据文本编辑器状态动态调整菜单和工具栏上对应操作的可用性。此外,还展示了如何遍历组件来查找并修改QAction对象的状态,确保UI与编辑器状态保持一致。
摘要由CSDN通过智能技术生成

一、编辑交互功能

1、编辑器中常规的编辑交互功能

2、QPlainTextEdit提供了丰富的交互接口

3、信号与槽的连接

编辑器代码修改:将action触发的信号映射到QPlainTextEdit对象的槽函数

 

二、文本编辑器中的界面状态

1、不是任何时候都可以复制、粘贴、撤销、重做(比如开始没有数据时)

2、QPlainTextEdit能够发送与界面状态相关的信号

3、实现步骤

(1)、连接界面状态信号到自定义的槽函数

(2)、通过文本信息找到对应的QAction对象

 根据文本信息找到QAction对象

QAction* MainWindow::findMenuBarAction(QString text)
{
    QAction* ret = NULL;

    const QObjectList& list = menuBar()->children();//获得菜单栏

    for(int i=0; i<list.count(); i++)
    {
        QMenu* menu = dynamic_cast<QMenu*>(list[i]);//获得每个子菜单

        if(menu != NULL)
        {
            for(int j=0; j<menu->actions().count(); j++)
            {
                if(menu->actions()[j]->text().startsWith(text))
                {
                    ret = menu->actions()[j];
                    break;
                }
            }
        }


    }

    return ret;
}
QAction* MainWindow::findToolBarAction(QString text)
{
    QAction* ret = NULL;

    const QObjectList& list = children();//获得主窗口的组件

    for(int i=0; i<list.count(); i++)
    {
        QToolBar* tb = dynamic_cast<QToolBar*>(list[i]);//只有工具栏能够转换成功

        if(tb != NULL)
        {
            for(int j=0; j<tb->actions().count(); j++)
            {
                if(tb->actions()[j]->toolTip().startsWith(text))//注意工具栏里面的是toolTip()
                {
                    ret = tb->actions()[j];
                    break;
                }
            }
        }
    }


    return ret;
}

根据文本信息找到QAction对象

(3)、通过信号标志设置QAction对象的界面状态

 通过信号标志设置QAction对象的界面状态

void MainWindow::onCopyAvailable(bool available)
{
    QAction* action = findMenuBarAction("Copy");
    if(action != NULL)
    {
        action->setEnabled(available);
    }
    action = findToolBarAction("Copy");
    if(action != NULL)
    {
        action->setEnabled(available);
    }

    action = findMenuBarAction("Cut");
    if(action != NULL)
    {
        action->setEnabled(available);
    }

    action = findToolBarAction("Cut");
    if(action != NULL)
    {
        action->setEnabled(available);
    }

}
void MainWindow::onUndoAvailable(bool available)
{
    QAction* action = findMenuBarAction("Undo");
    if(action != NULL)
    {
        action->setEnabled(available);
    }
    action = findToolBarAction("Undo");
    if(action != NULL)
    {
        action->setEnabled(available);
    }
}
void MainWindow::onRedoAvailable(bool available)
{
    QAction* action = findMenuBarAction("Redo");
    if(action != NULL)
    {
        action->setEnabled(available);
    }
    action = findToolBarAction("Redo");
    if(action != NULL)
    {
        action->setEnabled(available);
    }
}

通过信号标志设置QAction对象的界面状态

(4)、其它修改的地方:将Copy、Cut、Redo、Undo等初始状态设置为false

三、小结

(1)、QPlainTextEdit封装了常用的文本编辑功能

(2)、可以将信号直接连接到QPlainTextEdit的公有槽函数

(3)、界面状态是GUI开发的重点和难点

(4)、Qt中组件的状态信号能够简化界面状态的维护

(5)、主窗口中的组件可以通过遍历的方法找回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值