zoukankan      html  css  js  c++  java
  • 第四十一课、编辑交互功能的实现------------------狄泰软件学院

    一、编辑交互功能

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

  • 相关阅读:
    leetcode 576. Out of Boundary Paths 、688. Knight Probability in Chessboard
    leetcode 129. Sum Root to Leaf Numbers
    leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
    leetcode 402. Remove K Digits 、321. Create Maximum Number
    leetcode 139. Word Break 、140. Word Break II
    leetcode 329. Longest Increasing Path in a Matrix
    leetcode 334. Increasing Triplet Subsequence
    leetcode 403. Frog Jump
    android中webView加载H5,JS不能调用问题的解决
    通过nginx中转获取不到IP的问题解决
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6416342.html
Copyright © 2011-2022 走看看