文章目录
1 文本编辑器实现光标定位的功能
问题:如何计算编辑框中光标的位置?
思路:
- 文本框对象的内部包含了QTextCursor对象。
- 通过position()成员函数获取当前光标的字符位置。
- 根据光标的字符位置计算横纵坐标。
- 当光标位置发生变化时进行计算。
算法流程描述:
思想:
- 通过’\n’字符的个数计算所在行。
- 通过最后一个’\n’字符的下标计算所在行。
关键代码如下:
bool MainWindow::initMainEditor()
{
bool ret = true;
mainEditor.setParent(this);
connect(&mainEditor, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
connect(&mainEditor, SIGNAL(copyAvailable(bool)), this, SLOT(onCopyAvailable(bool)));
connect(&mainEditor, SIGNAL(redoAvailable(bool)), this, SLOT(onRedoAvailable(bool)));
connect(&mainEditor, SIGNAL(undoAvailable(bool)), this, SLOT(onUndoAvailable(bool)));
connect(&mainEditor, SIGNAL(cursorPositionChanged()), this, SLOT(onCursorPositionChanged()));
setCentralWidget(&mainEditor);
return ret;
}
void MainWindow::onCursorPositionChanged()
{
int pos = mainEditor.textCursor().position(); // 注意,这里的返回的位置从0开始,比如当前有输入框内有字符abc,光标停在a前面返回0,a后面返回1,b后面返回2,c后面返回3
QString text = mainEditor.toPlainText();
int col = 0;
int ln = 0;
int flag = -1;
for(int i=0; i<pos; i++)
{
if( text[i] == '\n' )
{
ln++;
flag = i;
}
}
flag++;
col = pos - flag;
statusLbl.setText("Ln: " + QString::number(ln + 1) + " Col: " + QString::number(col + 1));
}
参考资料: