第41课 - 编辑交互功能的实现

1、编辑交互功能 

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

     复制(Copy) ,粘贴(Paste), 剪切(Cut), 撒销(Undo) , 重做(Redo), 删除(Delete) 

QPlainTextEdit提供了丰富的交互功能接口 

 

信号与槽的连接 

2、编程实验 

基本编辑功能实现    NotePad.pro 

                   这里的action->setEnabled(false)代表初始界面状态false(即这些action不能操作)

 

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

不是任何时候都能够进行

           复制,粘贴      

           撤销,重做 

                如何维护文本编辑器的界面状态?

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

        - void copyAvailable(bool yes) 

        - void redoAvailable(bool available) 

        - void undoAvailable(bool available) 

        - void cursorPositionChanged() 

实现步骤 

      1. 连接界面状态信号自定义槽函数 

      2. 通过文本信息找到对应的QAction对象 

      3. 根据信号标志设置QAction对象的界面状态 

4、编程实验 

界面状态更新    NotePad.pro 

MainWindow.h 新增成员函数和槽函数

MainWindowUI.cpp 连接信号与槽

bool MainWindow::initMainEditor()
{
    bool ret = true;

    mainEditor.setParent(this);

    connect(&mainEditor, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
    connect(&mainEditor, SIGNAL(copyAvailable(bool)), this, SLOT(onCopyAvailable(bool)));
    connect(&mainEditor, SIGNAL(redoAvailable(bool)), this, SLOT(onRedoAvailable(bool)));
    connect(&mainEditor, SIGNAL(undoAvailable(bool)), this, SLOT(onUndoAvailable(bool)));

    setCentralWidget(&mainEditor);

    return ret;
}

MainWindowSlots.cpp的实现新增函数

void MainWindow::onCopyAvailable(bool available)
{
    findMenuBarAction("Copy")->setEnabled(available);//根据标志位设置指定action状态
    findMenuBarAction("Cut")->setEnabled(available);
    findToolBarAction("Copy")->setEnabled(available);
    findToolBarAction("Cut")->setEnabled(available);
}

void MainWindow::onRedoAvailable(bool available)
{
    findMenuBarAction("Redo")->setEnabled(available);
    findToolBarAction("Redo")->setEnabled(available);
}

void MainWindow::onUndoAvailable(bool available)
{
    findMenuBarAction("Undo")->setEnabled(available);
    findToolBarAction("Undo")->setEnabled(available);
}

QAction* MainWindow::findMenuBarAction(QString text)
{
    QAction* ret = NULL;
    const QObjectList& list = menuBar()->children();//const QObjectList & QObject::children () const

    for(int i=0; i<list.count(); i++)
    {
        QMenu* menu = dynamic_cast<QMenu*>(list[i]);

        if( menu != NULL )
        {
            QList<QAction*> actions = menu->actions();

            for(int j=0; j<actions.count(); j++)
            {
                if( actions[j]->text().startsWith(text) )//当前的action是所指定的action,找到了,返回
                {
                    ret = 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* toolBar = dynamic_cast<QToolBar*>(list[i]); //只有一个工具栏组件可以转换成功,其它失败返回NULL

        if( toolBar != NULL )//找到了工具栏
        {
            QList<QAction*> actions = toolBar->actions();

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

    return ret;
}

5、小结 

QPlainTextEdit封装了常用的文本编辑功能 

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

界面状态是GUI开发的重点和难点 

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

主窗口中的组件可以通过遍历的方式找回 

猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/81589378