【问题标题】:How to override/disable ncurses input?如何覆盖/禁用 ncurses 输入?
【发布时间】:2016-05-25 05:40:00
【问题描述】:

我正在编写代码,我想将其制成两种变体——使用 ncurses 实现的基于文本的界面 (TUI),以及使用 Qt5 实现的 GUI。因此,在命令行中传递一个参数,我可以选择运行哪个版本 - 使用 GUI 或 TUI(例如,就像在 openSUSE 中使用 YaST)。其余代码,包括来自键盘的输入,应该与选择的界面(TUI 或 GUI)无关。正如我所看到的,实现这样一个程序的最佳方式是使用不同的类进行输入、用户界面等。所以,在我运行代码的任何版本中,处理输入的类应该是相同的,并且它通过接口类的数据,可能是 TUI 或 GUI,这取决于应用程序的启动方式。问题在于,对于 ncurses,似乎不可能将输入与输出分离。基本上,我想要的是仍然能够使用 ncurses 输出(窗口、面板等),但要使用其他库执行输入。任何人都知道如何解决这个问题?另外,在任何模式(终端或 GUI)下,我可以使用哪些输入 C/C++ 库来读取键盘事件?

【问题讨论】:

  • 我建议为您的程序构建两个版本,一个用于 gui,一个用于 cli,或者检测不同的情况,并尽快将程序交给 QT 或命令行。试图概括这一点可能会比它的价值更麻烦。
  • 我想知道这是如何在 YaST 中实现的(以及其他可以同时使用 ncurses 和 GUI 界面运行的单一构建应用程序,具体取决于具体情况)。每个接口是否有不同的输入处理程序?
  • 我有理由确定这些应用程序不是单个可执行文件,而是使用不同选项编译的相同源代码 [for text and gui],以及一个包装器 shell 脚本(或二进制文件)决定使用哪个。
  • 好的,谢谢。我认为这将是一个简单的解决方案,但似乎反过来 :) 我会遵循 Phil 的建议。
  • XY 问题。 “从输出中分离输入”对您意味着什么? ncurses 究竟是如何阻碍它的?请提供说明问题的代码示例。

标签: c++ qt keypress ncurses keyevent


【解决方案1】:

在使用 ncurses 进行输出时,您不必使用 ncurses 的输入函数(例如 wgetch)。

一些程序会这样做(Midnight Commandervi-like-Emacs),因为它们使用的输入大部分没有使用 ncurses 解析为特殊键,例如

  • escape 字符本身(vi-like-Emacs),或
  • Midnight Commander 中的鼠标代码(使用 select 监控多个输入)。

管理不同的输出 流实际上可能更加困难,因为这些流使用有关您的程序在计算机屏幕上的外观的信息。输入通常不会占用超过一行左右的屏幕。

在 vi-like-Emacs 中,该程序使用一个终端驱动程序,该驱动程序知道如何使用特定类型的设备(终端仿真器、X windows、Win32 GUI),并且程序被编译并与该驱动程序链接。能够在运行时在驱动程序之间切换会很好,但鼠标处理的细微差别比键盘输入和屏幕更新更难考虑。

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2021-09-06
    • 2014-04-21
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多