crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QProcess сделать не видимым?
Гость_hmmmm_*
сообщение 8.4.2009, 12:42
Сообщение #1





Гости








    


Добрый день возниклас следующая задача, надо вызывать из программы другую, но так как она является консольным приложением то хотелось бы скрыть запуск. Можно ли сделать вызываемый процесс невидимым???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 8.4.2009, 12:46
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Можно, но только используя API ОС.

Под виндой нужно использовать хуки, под никсами не знаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.4.2009, 17:14
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Насколько я помню QProcess и так скрывает консольные приложения, например CMD.EXE. А чтобы они были видны надо использовать метод startDetached().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 8.4.2009, 19:25
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Аааа, вот вы о чем! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hmmm_*
сообщение 8.4.2009, 19:49
Сообщение #5





Гости








    


Спасибо вам, приеду домой щёлкну волшебную кнопочку)))

Возник ещё один вопрос;)

Использую Postgres и пишу обёртку над pg_dump и pg_restore (задание не критикуем я тоже в курсе что есть pgadmin3.. ))))

Когда запускаю pg_dump без параметров из консоли выводится
"Password:" и предложение ввести пароль. Надо чтобы пароль вводила сама программа. Пытаюсь это реализовтаь следующим образом:

CODE

#include <QtGui/QApplication>
#include <QtCore>
#include <QtGui>

class Shell : public QWidget
{
Q_OBJECT

private:
QProcess* process;
QLineEdit* txtCommand;
QTextEdit* txtDisplay;

public:
Shell(QWidget * parent =0) : QWidget(parent)
{
process = new QProcess(this);
txtDisplay = new QTextEdit;
QLabel* lbl = new QLabel("&Command");

txtCommand = new QLineEdit("dir");
lbl->setBuddy(txtCommand);
QPushButton* cmd = new QPushButton("&Enter");

connect(process, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()));
connect(process, SIGNAL(readyRead()), SLOT(writePass()));
connect(process, SIGNAL(readyReadStandardError()), SLOT(slotDataOnErrorStdout()));
connect(txtCommand, SIGNAL(returnPressed()), SLOT(slotReturnPressed()));
connect(cmd, SIGNAL(clicked()), SLOT(slotReturnPressed()));

QHBoxLayout* hbxLayout = new QHBoxLayout;
hbxLayout->addWidget(lbl);
hbxLayout->addWidget(txtCommand);
hbxLayout->addWidget(cmd);

QVBoxLayout* vbxLayout = new QVBoxLayout;
vbxLayout->addWidget(txtDisplay);
vbxLayout->addLayout(hbxLayout);
setLayout(vbxLayout);
}
public slots:
void slotDataOnStdout()
{
txtDisplay->append(process->readAllStandardOutput());
}
void slotDataOnErrorStdout()
{
txtDisplay->append(process->readAllStandardError());
}
void writePass()
{
//process->write("al\n");
txtDisplay->append("awerfawef");
//process->closeWriteChannel();
}
void slotReturnPressed()
{
QString strCommand = "pg_dump.exe";
process->start(strCommand);
}
};


При этом слот void slotDataOnStdout() ничего не выводит в TextEdit =(( до этого пробовал pg_dump с параметрами и удалось получать только сообщения об ошибках через void slotDataOnErrorStdout(). Ввод данных в процесс почему-то не увенчался успехом=( Да и думаю что надо вводить как-то хитрее чем просто передавать строку в process->write
Вообщем так вот =(

з.ы. В main ничего интересного обычный показ widgeta Shell
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.4.2009, 20:51
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Попробуй для начала данные читать во временный QByteArray и выводи в QTextEdit его размер, а не передавать его сразу в QTextEdit.
При конвертации QByteArray в QString чтение происходит до первого '\0', может быть данные где-то портятся.

У write() проверь возвращающееся значение, если -1, то ошибка, иначе количество переданных байт.

И проверь process->errorString() что выводит.

Сообщение отредактировал SABROG - 8.4.2009, 20:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hmmm_*
сообщение 8.4.2009, 21:08
Сообщение #7





Гости








    


Цитата(SABROG @ 8.4.2009, 20:51) *
Попробуй для начала данные читать во временный QByteArray и выводи в QTextEdit его размер, а не передавать его сразу в QTextEdit.
При конвертации QByteArray в QString чтение происходит до первого '\0', может быть данные где-то портятся.

У write() проверь возвращающееся значение, если -1, то ошибка, иначе количество переданных байт.

И проверь process->errorString() что выводит.


Проблема в том что сигналы readyReadStandardOutput()) и readyRead()) вообще не высылаются =((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hmmm_*
сообщение 9.4.2009, 0:15
Сообщение #8





Гости








    


Ловлю уже все сигналы... процесс стартует но при убийсте его почему не высылается finished. Started высылается нормально.. никаких ошибок не получаю =(( У кого=нибудь есть ещё идеи??(( Может быть кто-нибудь может првести примеры как грамотно читтаь из и писать в консольной приложение вызываемой через Qprocess???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hmmm_*
сообщение 9.4.2009, 0:17
Сообщение #9





Гости








    


совсем забыл запись в процесс сразу после создания успешно проходит, правда толку от этого ноль=((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 1.11.2010, 23:33
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


На вот

#include "myprocess.h"

myProcess::myProcess(QWidget *parent) : QDialog(parent)
{
        sb.setText("start");
        ib.setText("input");
        QVBoxLayout *vl=new QVBoxLayout;
        vl->addWidget(&sb);
        vl->addWidget(&te);
        vl->addWidget(&le);
        vl->addWidget(&ib);
        setLayout(vl);

        connect(&sb,SIGNAL(clicked()),this,SLOT(startProcess()));
        connect(&ib,SIGNAL(clicked()),this,SLOT(doInput()));
        connect(&myProc,SIGNAL(readyReadStandardOutput()),this,SLOT(showOutput()));
        connect(&myProc,SIGNAL(readyReadStandardError()),this,SLOT(showOutput()));
}

void myProcess::startProcess()
{
        QString prog="C:\\WINDOWS\\system32\\cmd.exe";
     //   QString prog="C:\\Qt\\2010.05\\qt\\Forum\\testcon-build-desktop\\release\\testcon.exe";
        myProc.start(prog);
        if(myProc.waitForStarted())
                te.append(QString("Program <b>%1</b> started").arg(prog));
        else
                te.append(QString("Can't start program <b>%1</b>").arg(prog));
}

void myProcess::doInput()
{
        QString s=le.text()+"\n";
        if(myProc.write(s.toAscii())!=-1) le.clear();
}

void myProcess::showOutput()
{
        te.append(QString::fromLocal8Bit(myProc.readAllStandardOutput()));
        te.append(QString::fromLocal8Bit(myProc.readAllStandardError()));
}


#include <QtGui>

class myProcess : public QDialog
{
Q_OBJECT

public:
myProcess(QWidget *parent=0);
private slots:
void startProcess();
void showOutput();
void doInput();
private:
QProcess myProc;
QTextEdit te;
QLineEdit le;
QPushButton sb,ib;
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 17:30