powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT и запуск сторонних приложений
15 сообщений из 40, страница 2 из 2
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
15 сообщений из 40, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT и запуск сторонних приложений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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