Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux-移动控制台光标_C++_Linux_Qt_Command Line Interface_Termios - Fatal编程技术网

C++ Linux-移动控制台光标

C++ Linux-移动控制台光标,c++,linux,qt,command-line-interface,termios,C++,Linux,Qt,Command Line Interface,Termios,我目前正在为linux设计一个CLI界面,由于各种原因,我无法使用ncurses。我只使用C++和QT框架。 因此,为了有一个用户友好的界面,我必须在一个单独的线程中运行这个getch循环: 这基本上意味着我必须自己实现所有基本功能(比如backspace)。我已经实现了命令完成和命令历史记录(比如在linux中按tab或uparrow/downarrow),但我不知道如何实现leftarrow/rightarrow(也就是通过typeahead进行搜索) 通常,我是这样实现的:在每个不等于-

我目前正在为linux设计一个CLI界面,由于各种原因,我无法使用ncurses。我只使用C++和QT框架。 因此,为了有一个用户友好的界面,我必须在一个单独的线程中运行这个getch循环:

这基本上意味着我必须自己实现所有基本功能(比如backspace)。我已经实现了命令完成和命令历史记录(比如在linux中按tab或uparrow/downarrow),但我不知道如何实现leftarrow/rightarrow(也就是通过typeahead进行搜索)

通常,我是这样实现的:在每个不等于-1的gech上,我检查用户是否按下了一个特殊的键(一个以某种方式修改typeahead的键)。然后,我使用以下函数清除标准输出:

void inputobject::clear_line(int nletters)
{
    QTextStream(stdout) << "\033[2K";

    for(int i = 0; i < nletters;i++){
        QTextStream(stdout) << "\b";
    }

    rewind(stdout);
}
void inputobject::clear_行(int-nletters)
{

QTextStream(stdout)不使用ncurses和co是一个严重的限制

在shell上进行正确的输入/输出以显示任何内容是非常困难的

我想到的唯一其他真正的解决方案(我不能认为是重新实现类似于ncurse的库的解决方案)是:

  • 调用dialog(例如www.linuxjournal.com/article/2807和文档:)
  • 将帧缓冲区机制与Qt4()一起使用

答案在Evilluff的评论中给出:

ANSI转义序列允许您在屏幕上随意移动光标。这对于由shell脚本生成的全屏用户界面更有用,但也可以用于提示。移动转义序列如下所示:

  • 定位光标: \033[;H 或 \033[L;Cf 将光标放在L行和C列
  • 将光标向上移动N行: \033[NA
  • 将光标向下移动N行: \033[NB
  • 将光标向前移动N列: \033[NC
  • 将光标向后移动N列: \033[ND

  • 清除屏幕,移动到(0,0): \033[2J

  • 删除到行尾: \033[K

  • 保存光标位置: \033[s]

  • 恢复光标位置: \033[u

您是否考虑过查看
ncurses
源代码以了解它是如何实现的?您不是在寻找吗?不鼓励只使用链接的答案,因为链接可能会消亡。如果您想将Evilluff的评论作为一个答案进行推广,您应该包括链接中所需的一切,以使其独立。