第四十九课、文本编辑器项目持续开发------------------狄泰软件学院

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

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对象反映可见性状态

posted @ 2017-02-21 15:11  lgc202  阅读(600)  评论(1编辑  收藏  举报