powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT и запуск сторонних приложений
40 сообщений из 40, показаны все 2 страниц
QT и запуск сторонних приложений
    #39918741
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здорова народ!

В общем, ситуация следующая:
Есть некий program.exe, который ведет диалог с пользователем в режиме запрос-ответ (то есть, waitForFinished - не вариант). К этой программе нужно прикрутить некий интерфейс, который будет получать из текстбоксов необходимые данные, сообщать их program.exe и делать что-то с полученным оттуда выводом.

В настоящий момент сие чудо выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
  process = new QProcess(this);
  process->setProgram("./program.exe");
  process->setReadChannel(QProcess::StandardOutput);
  process->start();
  ...
  qDebug()<<process->readAllStandardOutput();


В выводе получаем пустую строку, хотя program.exe при запуске выводит "Hello!"

Как быть? Как правильно пользоваться этой штукой?

Заранее спасибо
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918748
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он в поток ошибок что-то выводит наверное. Посмотри QProcess::StandardError
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918750
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, нет, тоже ничего, уже смотрел
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918768
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через какой API оно выводит "Hello"?
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918770
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota
Есть некий program.exe,
сделайте свою тест болванку с выводом в консоль.
И свяжите с Qt.
Вообще, какой смысл вести диалог сразу и в консольной и в ГУИ на одну и туже тему?
Или вы хотите заменить диалог консольной на диалог в ГУИ?
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918791
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идет попытка построить свой IPC.

КМК надо было сразу начинать D-Bus и ему подобных протоколов (только под Windows).
И тогда интеграция двух приложений прошла-бы красиво и бесшовно. Или на сетевых сокетах.

Вобщем если автор - создатель program.exe и этого чуда то ему надо думать в этом направлении.

Из говна и палок STDOUT/STDIN хорошая дуплексная интеграция не получается.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918793
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSTDOUT/STDIN хорошая дуплексная интеграция не получается.

"Чо?" (с)

Туева хуча консольных утилит имеют вполне вменяемые гуевые фронтенды. Руки просто надо
иметь на правильном месте.

PS: ТС не говорил, что program.exe - консольная.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918794
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
PS: ТС не говорил, что program.exe - консольная.
а какие варианты могут быть?
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918803
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpа какие варианты могут быть?

В сабже Qt, значит гуй.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918809
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Я так прнял, у него сторонняя консольная утилита и сам проект ГУЙ над консольной в Qt.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918818
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Да, утилита консольная, хочу с ней общаться от лица гуя, чтобы было все по красоте
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918819
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Да, именно
Хочу чтобы вместо консоли можно было с ним общаться через гуй
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918820
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edit: работаем под линуксом
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918821
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Stdout
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918826
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota
PetroNotC Sharp,
Да, именно
Хочу чтобы вместо консоли можно было с ним общаться через гуй

22066654
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918828
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Смысл в том, что по тз нужно сдавать консольное приложение, а общаться с ним для тестирования удобнее через гуй
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918829
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota,
сделайте консольку тестовую за 5 минут. И пробуйте подключить ее.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918832
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

С консолькой проблем нет, она прекрасно работает и даже сдана
Заказчик ее использует роботом и ему удобно, а нам ее нужно юзать через гуй и нам не удобно
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918833
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Заказчик подготавливает файл с вводом, и у него все прекрасно. Написано на c++ без qt, опять же по требованию заказчика
А теперь я хочу прикрутить к этому qt и выполнять по шагам, генерируя запросы на каждый чих
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918859
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota,
Ты не понял.
Программист? Если да, то ты обязан уметь готовить тестовую площадку на своем личном компе. Установить бд, ось, виртуалку, облако и т.д.
Вот тут я предлагаю познакомиться с консольными приложениями.
У меня подозрения что ты их никогда не писал.
Раз спорим из за 5 мин. работы.
Имхо, удачи!
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918861
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Спасибо, конечно, но по-моему это ты меня не понял
У меня консольное приложение уже есть, не смотря на то что .exe
Проблема при подключении гуя уже к нему
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918862
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakotaПроблема при подключении гуя уже к нему

Начни с локализации проблемы: подключи свой гуй к заведомо работающему приложению типа cat
или ls.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918870
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Так, уже что-то проясняется
При подключении к ls есть хотя бы какой-то вывод, но вызывается он, похоже, из какой-то волшебной сгенерированной директории, и моего экзешника там конечно же нет
Значит следующая задача момента - это научиться ходить по директориям. Я так понимаю, это должно быть связано с функцией setAtguments(), которой сейчас будем учиться пользоваться

(Если все получится, куплю файерберд)
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918873
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota,
Ну вот, а вы говорите что прога есть, и консольные программы не требуют изучения.
Изучайте. Как чужие типа cat так и самолично написанные.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918879
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не считаю целесообразным долго обсуждать отсутствующий код.

Автор. Нужны сорцы и условия воспроизведения дефекта.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918880
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota
но вызывается он, похоже, из какой-то волшебной сгенерированной директории, и моего экзешника там конечно же нет

А в документации к QProcess пишут про рабочую директорию, не?
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918882
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

В общем, краткое содержание общей картины
Для универа был написан код на С++, который работает через консольку. Получает на вход строки типа "прочесть_альбом", "удалить фотографию" и так далее. Получает с консоли ввод и отправляет на консоль вывод, вроде "фото удалено" и "альбом добавлен".
Теперь, ввиду расширения горизонтов, я хочу прикрутить к этому коду гуй под линукс, который будет работать вместо консоли, а именно выписывать необходимые команды и анализировать вывод.
После последнего эксперимента(попытаться вместо моей замечательной программы вызвать ls) выяснилось, что мое замечательное приложение сначала нужно найти, ибо гуй похоже запускается из какой-то своей сгенерированной директории, поэтому собственно ничего и не выходит.
program.exe лежит по адресу "~/Desktop/qtwork/collections", там же где и все остальные имеющие отношение к делу файлы.
Далее предоставляю имеющийся код в полном, так сказать, объеме:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
#include "mywindow.h"
#include <QPushButton>
#include <QLabel>
#include <iostream>
#include <QTextEdit>
#include <QMessageBox>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QtGui>
#include <QList>
#include <QDebug>
#include <QProcess>
#include <QIODevice>
#include <QDir>
#include <QStringList>
#include <QApplication>
#include <QString>
QProcess* process;

myWindow::myWindow(QWidget *parent) : QMainWindow(parent){};

void myWindow::dataReadyFromSubProcess(){
  qDebug()<<process->readAllStandardOutput();
};

void myWindow::start_clicked(){
  process = new QProcess(this);
  process->setProgram("./program.exe");
  QApplication::processEvents();
  //здесь нужно как-то найти путь(?) к program.exe, как я понял, и тогда все должно получиться. Если конечно дело не в том, что ls 
  //выдает ответ только потому, что он заканчивается и сразу скидывает все в буфер, откуда потом вычитывается правильный ответ
  process->start();
  process->waitForStarted();
  qDebug()<<process->arguments();
  process->setReadChannelMode(QProcess::SeparateChannels);
  process->waitForReadyRead(3000);
  auto start = qobject_cast<QPushButton *>(sender());
  Q_ASSERT(start);
  start->close();
  QTextEdit* line = new QTextEdit("Welcome!\nWhat would you like to do?", this);
  line->setGeometry(10, 10, 270, 30);
  line->setReadOnly(true);
  line->setStyleSheet("background-color: rgba(0, 0, 0, 0%)");
  line->show();

  QTextEdit* line2 = new QTextEdit("Current album: none", this);
  line2->setGeometry(10, 50, 270, 30);
  line2->setReadOnly(true);
  line2->setStyleSheet("background-color: rgba(0, 0, 0, 0%)");
  line2->show();

  QPushButton* readAlbum = new QPushButton("Read new album", this);
  readAlbum->setGeometry(10, 90, 220, 30);
  QObject::connect(readAlbum, SIGNAL(clicked()), this, SLOT(read_album()));
  readAlbum->show();

  //куча отрисовки и прочей шелухи
  ...
};

void myWindow::read_album(){
  myWindow* window = new myWindow();
  //еще отрисовка шелухи
  ...
  QPushButton* send = new QPushButton("Send", window);
  send->setGeometry(10, 410, 80, 30);
  QObject::connect(send, SIGNAL(clicked()), this, SLOT(send_album()));
  send->show();

  window->resize(600, 460);
  window->show();
};
void myWindow::send_album(){
  auto send = qobject_cast<QPushButton *>(sender());
  Q_ASSERT(send);
  QList<QLineEdit *> name = send->parent()->findChildren<QLineEdit *>();
  QTextEdit* text = send->parent()->findChild<QTextEdit *>();
  QTextCursor cursor(text->textCursor());
  text->selectAll();
  process->waitForReadyRead(3000);
  QString output(process->readAllStandardOutput());
  process->closeReadChannel(process->readChannel()); //здесь по идее идет сбор данных, чтобы собрать из них будущий запрос, но 
                                                      //пока что я просто пытаюсь получить "Hello!" из консоли (program.exe: cout << "Hello!" << endl;)
  text->setText(output);
  qDebug()<<output;

};

void myWindow::stop(){
  process->kill();
};



Вот собственно такая вот ботва, посоветуйте кто что может, добрые люди
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918883
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё,

Вообще пишут, да. Можно даже поставить любой свой QProcessEnvironment, но он все равно создает свою директорию, из которой не хочет никуда выходить, а запустить в уже существующей либо нельзя, либо я не нашел как, и тогда каюсь
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918884
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Совсем в пиковом случае, можно конечно весь этот program.exe конечно переписать в гуй, возложить на него все рассчеты и больше не трахаться, благо у меня на руках есть исходники и того и другого. Но хочется все-таки освоить машинку. Если, конечно, такая фича вообще есть и предусмотрена, о чем пока никто ничего не знает.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918892
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota
ёёёёё,

Вообще пишут, да. Можно даже поставить любой свой QProcessEnvironment, но он все равно создает свою директорию, из которой не хочет никуда выходить, а запустить в уже существующей либо нельзя, либо я не нашел как, и тогда каюсь

Поставить кьют вместе с исходниками и просто посмотреть в коде, как сделано?
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918894
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё,

Имеешь в виду почитать сами исходники кьюта в поисках того что надо?
Ну, если ситуация окажется совсем безнадежной, то пойду этим заниматься
Но пока что у меня есть надежда на то, что кто-то уже с этим сталкивался)
Хьюман интерракшн все-таки интереснее, чем исходники листать, во всяком случае пока хд
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918895
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota
PetroNotC Sharp,

С консолькой проблем нет, она прекрасно работает и даже сдана
Заказчик ее использует роботом и ему удобно, а нам ее нужно юзать через гуй и нам не удобно

Если есть исходники - оформи нужный функционал в виде библиотеки. Например, динамической (dll/so), или статической.
Зачем мучиться.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918898
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakotaХьюман интерракшн все-таки интереснее

Это называется "паразитизм".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918899
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota
почитать сами исходники кьюта в поисках того что надо?
Ну, если ситуация окажется совсем безнадежной, то

Я в первую очередь такое делаю, как минимум ради любопытства. И сразу понятно, какие ограничения кроссплатформенный фичи по сравнению с платформозависимыми реализациями.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918923
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вижу, "тут никто не знает Delphi". И это правильно, QT здесь не нужен.

Для того, чтобы вести с консольным приложением такой диалог, оно должно вызывать flush для stdout после каждого своего высказывания. Вот, например, хорошее, годное консольное приложение на голом С, которое как раз это и делает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFFER_SIZE 1024

int main(void) {
    char * buffer = calloc(BUFFER_SIZE, 1);
    while(fgets(buffer, BUFFER_SIZE, stdin) != NULL) {
        //выводим обратно в stdout:
        fprintf(stdout, "echo: %s", buffer);
        
        fflush(stdout); //это обязательно, без этого не выйдет ничего!
        //в c++ нужно делать std::cout.flush();
    }
}



Теперь вызывающая сторона:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
#include <iostream>
#include <string>
#include <unistd.h>
#include <fstream>

//функцию попятил в недрах stackowerflow (из ответа, а не из вопроса). Лень было вспоминать, кому dup, кому dup2, кому close.
pid_t popen2(const char *command, int *infp, int *outfp) {
  int p_stdin[2], p_stdout[2];
  pid_t pid;

  if (pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
    return -1;

  pid = fork();

  if (pid < 0)
    return pid;
  else if (pid == 0)
  {
    close(p_stdin[1]);
    dup2(p_stdin[0], 0);
    close(p_stdout[0]);
    dup2(p_stdout[1], 1);
    execl("/bin/sh", "sh", "-c", command, NULL);
    exit(1);
  }

  if (infp == NULL)
    close(p_stdin[1]);
  else
    *infp = p_stdin[1];

  if (outfp == NULL)
    close(p_stdout[0]);
  else
    *outfp = p_stdout[0];

  return pid;
}

// до остального сам догадался :)
#define BUFFER_SIZE 1024

int main(){
  int infp, outfp, r;
  char* buffer = (char*)malloc(BUFFER_SIZE);

  //собственно, вызов. "echo.out" - это приложение из первой портянки.
  std::cout << popen2("./echo.out", &infp, &outfp);

  std::string s;
  while(1) {
    
    std::cin >> s;
    s += "\n";
    write(infp, s.c_str(), s.length());
    //прилепили к строке символ конца строки и скормили его на stdin вызываемой стороны

    do {
      r =  read(outfp, buffer, BUFFER_SIZE);
      if (r >= 0) {
        s = buffer;
        std:: cout << s;
      }
    } while (r == BUFFER_SIZE);
    //вычитали вывод вызываемой стороны, сколько его не есть, вывели в свой stdout и пошли по новой.

  }

}
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918932
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmon,
ужос.

Маленькие CGI - аппликации, запускаемые в Qt - сервере...
:)
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39918945
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota
Код: plaintext
1.
2.
3.
Если конечно дело не в том, что ls 
  //выдает ответ только потому, что он заканчивается и сразу скидывает все в буфер, откуда потом вычитывается правильный ответ
  process->start();

а кто это кроме тебя должен делать?
Искать разницу между твоим непонятным.exe и заведомо рабочими ls, nano,....
Возвращаемся на 1 страницу - пиши консольную и тестируй.
Либо как сказали выше. Выполни проект на заранее рабочей утилите.
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39919048
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот кстати стандартная утилита ftp вызывает (void)fflush(cout) перед тем, как выдать свой prompt. Поэтому ей можно управлять через такую механику. Вот на ней можно отлаживаться, она точно работает!
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39919110
bananatarakota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо за ваше потраченное время (и нервы) :)
...
Рейтинг: 0 / 0
QT и запуск сторонних приложений
    #39919114
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bananatarakota, можно закрывать топик?
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT и запуск сторонних приложений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]