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