第四十九课、文本编辑器项目持续开发------------------狄泰软件学院
一、开发目标一:指定目标行号并跳转执行
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对象反映可见性状态
本文作者:lgc202
本文链接:https://www.cnblogs.com/gui-lin/p/6424211.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步