QProcess сделать не видимым? |
Здравствуйте, гость ( Вход | Регистрация )
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
|
Гости |
Попробуй для начала данные читать во временный 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 <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; }; |
|
|
Текстовая версия | Сейчас: 28.1.2025, 7:45 |