码迷,mamicode.com
首页 > 其他好文 > 详细

第四十九课、文本编辑器项目持续开发

时间:2017-02-21 15:55:01      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:views   isp   ast   rac   lin   bug   void   set   this   

一、开发目标一:指定目标行号并跳转执行

1、用户需求

(1)、提示输入对话框

(2)、用户可输入目标行号

(3)、确定后光标跳转到指定行

2、行间跳转算法设计

(1)、通过输入对话框获取目标行号

(2)、查找换行符的位置计算目标行的第一个字符字符下标

(3)、通过QCursor定位到目标行

技术分享

技术分享
void MainWindow::onEditGoto()
{
    bool ok = false;
    int ln = QInputDialog::getInt(this, "转到", "行号: ", 1, 1, mainEdit.document()->lineCount(), 1, &ok);//第一步

    if(ok)
    {
        QString text = mainEdit.toPlainText();
        QTextCursor c = mainEdit.textCursor();

        int pos = 0;
        int next = -1;

        for(int i=0; i<ln; i++)//第二步
        {
            pos = next + 1;//最后一个换行符的下一个字符就是目标行的第一个字符

            next = text.indexOf(\n, pos);
        }

        c.setPosition(pos);//第三步

        mainEdit.setTextCursor(c);

    }
}
跳转算法的实现

二、开发目标二:设置工具栏和状态栏的可见性

1、实现思路

(1)、通过setVisible()设置可见性

(2)、更新界面上QAction对象的状态

A、菜单中的QAction是否可以勾选

B、工具栏中的QAction对象是否按下

技术分享

 

技术分享
void MainWindow::onViewStatusBar()
{
    QStatusBar* sb = statusBar();

    bool visible = sb->isVisible();

    sb->setVisible(!visible);

    QAction* action = findMenuBarAction("状态栏");
    if(action != NULL)
    {
        action->setChecked(!visible);
    }
    action = findToolBarAction("状态栏");
    if(action != NULL)
    {
        action->setChecked(!visible);
    }


}
void MainWindow::onViewToolBar()
{
    const QObjectList& list = children();

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

        if(tb != NULL)
        {
            bool visible = tb->isVisible();

            tb->setVisible(!visible);

            QAction* action = findMenuBarAction("工具栏");
            if(action != NULL)
            {
                action->setChecked(!visible);
            }
            action = findToolBarAction("工具栏");
            if(action != NULL)
            {
                action->setChecked(!visible);
            }

            break;
        }
    }


}
工具栏与状态栏的可见性

发现了一个Bug , findMenuBarAction函数无法正确使用,目前还找不到问题

三、小结

(1)、通过输入对话框获取目标行号并实现行间跳转

(2)、根据用户操作状态控制状态栏和工具栏的可见性

(3)、菜单和工具栏中的QAction对象反映可见性状态

第四十九课、文本编辑器项目持续开发

标签:views   isp   ast   rac   lin   bug   void   set   this   

原文地址:http://www.cnblogs.com/gui-lin/p/6424211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!