2009-12-05 1 views
0

У меня есть приложение GUI, которое создает внутри QProcess, выхватывает его вывод и показывает его на форме. Мне нужно как-то уловить ключевые события из формы, чтобы передать их QProcess (чтобы сделать это как можно ближе к реальному оконечному окну).Каков рекомендуемый способ передачи событий keyboad в QProcess прозрачно?

Итак, я полагаю, я должен обрабатывать keyReleaseEvent() и каким-то образом преобразовать либо event.text() (который QString) или event.key() (который int) аргументу, подходит для process.write() (который принимает char* или QByteArray). Есть ли рекомендуемый способ сделать такое преобразование (с учетом проблем локализации, модификаторов ctrl/alt/shift и т. Д.)? Я действительно не хочу строить какое-то сопоставление от key() возвращаемых значений до char* строк; и text() капель модификаторов.

Кроме того, если я начну процесс с командой bash -c sudo something в QProcess, он выходит мгновенно, жалуясь, что «нет TTY присутствует и ни одна программа askpass не указано», так что я могу делать что-то совершенно неправильно ...

+1

Просто комментируйте, так как это не отвечает на главный вопрос. Чтобы решить проблему «no tty ...», вы можете убедиться, что вы задали переменную среды SUDO_ASKPASS с помощью QProcess :: setEnvironment (http://doc.trolltech.com/4.6/qprocess.html#setEnvironment). Он должен быть установлен на путь запускаемой программы, которая принимает аргумент (приглашение) и записывает пароль в стандартный вывод. – imaginaryboy

+0

Я бы предпочел не устанавливать некоторые эзотерические переменные для каждой сверхпараноидальной программы ... Надеюсь, существует общий способ заставить мой QProcess вести себя точно так же, как приложение терминала. – fjarri

ответ

2

Проблема это больше, чем просто принятие решения о том, что писать в процессе.

Вы не можете эмулировать терминал только путем чтения/записи stdout/stdin процесса, это сложнее, чем это. Подумайте о программе less или о любом пейджере, например. Как он знает, сколько строк печатать одновременно? Ему нужна информация о терминале, который не представлен через stdin/stdout/stderr.

Эмуляция терминала выходит за рамки QProcess. Если вы действительно уверены, что вам нужно это сделать, используйте в качестве отправной точки какой-то существующий эмулятор терминала на основе Qt (например, Konsole).

+0

Да, Konsole, похоже, делает именно то, что я хочу ... Мне, вероятно, придется отрезать некоторые части от него) – fjarri

Смежные вопросы