Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QProcess сделать не видимым?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
hmmmm
Добрый день возниклас следующая задача, надо вызывать из программы другую, но так как она является консольным приложением то хотелось бы скрыть запуск. Можно ли сделать вызываемый процесс невидимым???
ViGOur
Можно, но только используя API ОС.

Под виндой нужно использовать хуки, под никсами не знаю.
SABROG
Насколько я помню QProcess и так скрывает консольные приложения, например CMD.EXE. А чтобы они были видны надо использовать метод startDetached().
ViGOur
Аааа, вот вы о чем! :)
hmmm
Спасибо вам, приеду домой щёлкну волшебную кнопочку)))

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

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

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

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

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

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


Проблема в том что сигналы readyReadStandardOutput()) и readyRead()) вообще не высылаются =((
hmmm
Ловлю уже все сигналы... процесс стартует но при убийсте его почему не высылается finished. Started высылается нормально.. никаких ошибок не получаю =(( У кого=нибудь есть ещё идеи??(( Может быть кто-нибудь может првести примеры как грамотно читтаь из и писать в консольной приложение вызываемой через Qprocess???
hmmm
совсем забыл запись в процесс сразу после создания успешно проходит, правда толку от этого ноль=((
bigory
На вот

#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;
};
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.