Я пишу код, и я хотел бы сделать его в двух вариантах — с текстовым интерфейсом (TUI), реализованным с помощью ncurses, и с GUI, реализованным с помощью Qt5. Таким образом, передавая аргумент в командной строке, я могу выбрать, какую версию запускать — с GUI или TUI (например, как с YaST в openSUSE). Остальная часть кода, включая ввод с клавиатуры, не должна зависеть от того, какой интерфейс (TUI или GUI) выбран. На мой взгляд, оптимальный способ реализации такой программы — использовать разные классы для ввода, для пользовательского интерфейса и т. Д. Итак, в какой бы версии я ни запускал код, класс, обрабатывающий ввод, должен быть одинаковым, и он проходит данные в интерфейсный класс, который может быть TUI или GUI, в зависимости от того, как было запущено приложение. Проблема в том, что для ncurses кажется невозможным отсоединить ввод от вывода. По сути, я хочу по-прежнему иметь возможность использовать вывод ncurses (окна, панели и т. Д.), Но выполнять ввод с другой библиотекой. Кто-нибудь знает, как это решить? Кроме того, какие входные библиотеки C / C ++ я могу использовать для чтения событий клавиатуры в любом режиме (терминал или графический интерфейс)?
Вам не нужно использовать функции ввода ncurses (такие как wgetch
) при использовании ncurses для вывода.
Несколько программ делают это (Полуночный командир, VI-как-Emacs) потому что они используют входы, которые в основном не преобразованы в специальные ключи с использованием ncurses, таких как
select
для мониторинга нескольких входов).Управление разными выход потоки на самом деле могут быть более сложными, поскольку они используют информацию о появлении вашей программы на экране компьютера. Входные данные обычно не занимают больше, чем строка или около того экрана.
В vi-like-Emacs программа использует драйвер терминала, который знает, как работать с определенным типом устройства (эмулятор терминала, X windows, Win32 GUI), и программа компилируется и связывается с этим драйвером. Было бы неплохо иметь возможность переключаться между драйверами во время выполнения, но нюансы работы с мышью сложнее выделить, чем ввод с клавиатуры и обновления экрана.
Других решений пока нет …