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

1、编辑交互功能

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

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

    1.3、 信号与槽的连接
                



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

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

            

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

    2.3、实现步骤(三部曲)
        2.3.1、连接界面状态信号到 自定义的槽函数

        2.3.2、通过文本信息找到对应的QAction对象。

/*************   通过文本信息找到对应的QAction对象   ******************/
QAction* MainWindow::findMenuBarAction(QString text)//菜单栏的
{
    QAction* ret = NULL;
    const QObjectList& list = menuBar()->children();//获得菜单栏里面的子组件(list整体)。
    for(int i=0; i<list.count(); i++)
    {       //因为有父子继承关系,所以用dynamic_cast<>()
        QMenu* menu = dynamic_cast<QMenu*>(list[i]);//获得每一个子菜单。
        if(menu != NULL)
        {
            QList<QAction*> actions = menu->actions();//获得子菜单Action?
            for(int j=0; j<actions.count(); j++)
            {//遍历action对象。
                if(actions[j]->text().startsWith(text))
                {
                    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* tb = dynamic_cast<QToolBar*>(list[i]);//只有工具栏能够转换成功。
        if(tb != NULL)
        {
            for(int j=0; j<tb->actions().count(); j++)
            {//原来的bug是text()改为toolTip()就没了。
                if(tb->actions()[j]->toolTip().startsWith(text))
                {
                    ret = tb->actions()[j];
                    break;
                }
            }
        }
    }
    //qDebug() << "22222222222222222222222222";
    //qDebug() << text << "qwewqe" << ret;
    return ret;
}

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);
    }
    //findMenuBarAction("Cut")->setEnabled(available);//,这样不安全。防止为NULL
    //findToolBarAction("Cut")->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);
    }
}
void MainWindow::onUndoAvailable(bool available)
{
    QAction* action = findMenuBarAction("Undo");
    if(action != NULL)
    {
        action->setEnabled(available);
    }
    action = findToolBarAction("Undo");
    if(action != NULL)
    {
        action->setEnabled(available);
    }
}


4、其他修改的地方:将copy,Cut,Redo,Undo等舒适状态设置为false


3、小结

    3.1、 QPlainTextEdit 封装了常用的文本编辑功能
    3.2、 可以将信号直接连接到 QPlainTextEdit的公有槽函数
    3.3、 界面状态是GUI开发的重点和难点
    3.4、 Qt中组件的 状态信号 能够简化界面状态的维护
    3.5、 主窗口中的组件 可以通过遍历的方法找回





   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值