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


    一、编辑交互功能

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

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

    3、信号与槽的连接

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

     

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

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

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

    3、实现步骤

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

    (2)、通过文本信息找到对应的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对象的界面状态

    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)、主窗口中的组件可以通过遍历的方法找回

  • 相关阅读:
    springboot整合log4j2
    document解析html
    关于字符串读写乱码的解决方法浅谈
    BOM知识整理
    es6的Map()构造函数
    es6的Set()构造函数
    关于node的path模块
    java总结(方法与对象)
    webpack3.0+总结
    java总结(二)(运算符)
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6416342.html
Copyright © 2020-2023  润新知