Russian Qt Forum

Qt => Вопросы новичков => Тема начата: wildcat от Январь 24, 2012, 16:24



Название: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 24, 2012, 16:24
Здравствуйте. Недавно начал учить qt4, до этого работал в с++ и то не очень серьезно. Буду очень признателен за помощь.

Имеется 6 текстовых объектов, в которые пользователь вводит параметры, нажав кнопку выполнить, должны выполнится консольная команда если все поля заполнены:

команда edit_1 edit_2 edit_3 edit_4 edit_5 edit_6



Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 24, 2012, 16:25
QProcess тебе поможет


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: Пантер от Январь 24, 2012, 16:26
Читай (http://doc.qt.nokia.com/4.8-snapshot/qprocess.html).


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 24, 2012, 16:53
Извините за наглость, а можно кусок кода, приблизительно как это реализуется


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: Пантер от Январь 24, 2012, 16:57
Там же все есть:
Код
C++ (Qt)
QObject *parent;
    ...
    QString program = "./path/to/Qt/examples/widgets/analogclock";
    QStringList arguments;
    arguments << "-style" << "motif";
 
    QProcess *myProcess = new QProcess(parent);
    myProcess->start(program, arguments);
 


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 25, 2012, 08:58
Спасибо большое


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 25, 2012, 09:41
Как сделать так что бы при заполнении полей активировалась кнопка "Выполнить"? Вот как сделать при заполнении одного поля, нашел в книги, а как сделать при заполнении всех обязательных полей не пойму.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: Пантер от Январь 25, 2012, 09:47
Изменение всех полей коннектишь на слот и в нем проверяешь все поля на заполненность.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 26, 2012, 16:43
Извините, а можно что нибудь для примера? Без примера не получается... Долблюсь как рыба об лед.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 26, 2012, 16:44
Ну показывай как долбишься


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 10:43
не совсем пойму как сделать проверку для нескольких кнопок, вот сделал только для первой.



usbcontroller.h:
Код
C++ (Qt)
#ifndef USBCONTROLLER_H
#define USBCONTROLLER_H
#include <QDialog>
#include "ui_usbController.h"
 
class usbController : public QDialog, public Ui::usbController
{
   Q_OBJECT
public:
   usbController(QWidget *parent = 0);
private slots:
   void on_lineEdit_1_textChanged();
};
#endif // USBCONTROLLER_H
 
usbcontroller.cpp:
Код
C++ (Qt)
#include <QtGui>
#include "usbcontroller.h"
 
usbController::usbController(QWidget *parent) : QDialog(parent)
{
   setupUi(this);
  buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
 
   connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
   connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
 
}
void usbController::on_lineEdit_1_textChanged()
{
buttonBox->button(QDialogButtonBox::Ok)->setEnabled(lineEdit_1->hasAcceptableInput());
}
 
main.cpp
Код
C++ (Qt)
#include <QApplication>
#include <usbcontroller.h>
 
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   usbController *dialog = new usbController;
   dialog->show();
   return app.exec();
}
 


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 27, 2012, 10:56
Ну например
buttonBox->button(QDialogButtonBox::Ok)->setEnabled(lineEdit_1->hasAcceptableInput() && lineEdit_2->hasAcceptableInput());


Название: Re: Как при нажатии кнопки выполнить консоль&
Отправлено: wildcat от Январь 27, 2012, 11:01
так не работает, пробовал уже... Кнопка становится сразу активной, как только текст появляется в первом edit.
а надо что бы пока все lineEdit не будут заполненными, кнопка была не активна.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 27, 2012, 11:04
А какой валидатор или маска стоят на полях ввода?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 11:08
Нет маски и нет валидатора, я так понимаю валидатор используется для проверки маски, а тут маска не нужна, только проверка заполнения полей. Может что то не так понимаю


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 27, 2012, 11:19
Цитировать
acceptableInput : const bool

This property holds whether the input satisfies the inputMask and the validator.

По умолчанию это свойство равно true.

Функции доступа: bool    hasAcceptableInput () const

hasAcceptableInput() используется если есть маска и валидатор. Зачем он тебе, если ты эти сущности не используешь??

Может лучше text().isEmpty() ?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 11:36
да я нуб, 4й день день только сижу с qt. Как в книге было написана, на примере и сделал...


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 12:49
задачу поставили, теперь маюсь. Есть консольная программа, на нее пытаюсь разработать морду. Как то не клеится.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 27, 2012, 12:51
да я нуб, 4й день день только сижу с qt. Как в книге было написана, на примере и сделал...

Это отмазка, чтобы не читать доки?
text().isEmpty() попробовал?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 12:57
Все с удовольствием читаю. Понимание приходит со временем. Без документа не куда. Но больше помогают примеры, в примере наглядно видно.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 13:03
text().isEmpty() - пробовал. но видать что то не туда вставляю.

Вот создал слот

private slots:
void on_lineEdit_1_textChanged();

Проверяю на заполнение:

void usbController::on_lineEdit_1_textChanged()
{

    buttonBox->button(QDialogButtonBox::Ok)->setEnabled(lineEdit_1->text().isEmpty());
}


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 27, 2012, 13:07
Код
C++ (Qt)
void usbController::on_lineEdit_1_textChanged()
{
   buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!(lineEdit_1->text().isEmpty()) && !(lineEdit_2->text().isEmpty()) );
}


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 13:43
Код
C++ (Qt)
void usbController::on_lineEdit_1_textChanged()
{
   buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!(lineEdit_1->text().isEmpty()) && !(lineEdit_2->text().isEmpty()) );
}

Спасибо большое помогло. Правда когда только указываю  для проверки один lineEdit:
 
Код
C++ (Qt)
void usbController::on_lineEdit_1_textChanged()
{
   buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!(lineEdit_1->text().isEmpty()));
}

Не пойму, это для каждого lineEdit надо делать слот?
on_lineEdit_1_textChanged()
on_lineEdit_2_textChanged()
и т.д.?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 27, 2012, 13:45
нет, надо все коннектить в один слот и там все же и проверять


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 13:57
вот например создаю слот:

private slots:

void textChanged();

Вот создаю проверку и все вставляю в один слот:

Код
C++ (Qt)
 
void usbController::textChanged()
{
   buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!(lineEdit_1->text().isEmpty()) && !(lineEdit_2->text().isEmpty()) );
}

только тогда вообще ничего не работает...
P.S. Извините, за глупые вопросы.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 27, 2012, 13:58
А сигналы от LineEdit'ов к слоту коннектишь?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 14:25
этого не делал.

Вот как понимаю взаимодействие слота и сигнала.
Есть объект_1, при событии вызывает сигнал_1
Есть объект_2, у него есть слот отвечающий на этот сигнал.

Т.е. connect(объект_1, сигнал_1, объект_2, слот_1)

Так понимаю каждый LineEdit надо законнектить на этот слот?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 27, 2012, 14:27
Путь твой лежит в царство документации Qt и начинать стоит отсюда http://doc.crossplatform.ru/qt/4.7.x/signalsandslots.html


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 27, 2012, 15:21
Спасибо большое)))
получилось вот так:

Код
C++ (Qt)
#include <QtGui>
 
#include "usbcontroller.h"
 
 
usbController::usbController(QWidget *parent) : QDialog(parent)
{
   setupUi(this);
  buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
 
   connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
   connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
 
   connect(lineEdit_1, SIGNAL(textChanged(QString)), this, SLOT(Changedtext()));
   connect(lineEdit_2, SIGNAL(textChanged(QString)), this, SLOT(Changedtext()));
}
 
 
 
void usbController::Changedtext()
{
 
   bool Ok = true;
   {
       Ok &= !lineEdit_1->text().isEmpty();
       Ok &= !lineEdit_2->text().isEmpty();
       if (Ok){
          // emit enableNext();
           buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
       }
   }
}


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: sudo от Январь 27, 2012, 18:04
Ой, зачем такие сложности

Код:
 
void usbController::changedText()
{
    buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!lineEdit_1->text().isEmpty() && !lineEdit_2->text().isEmpty())
}


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 09:54
После заполнения всех lineEdit, хочу выполнить команду в консоли, lineEdit - параметры команды. Делаю так:

Код
C++ (Qt)
void usbController::buttonBox_ok()
{
   QObject *parent;
   QString program = "./sbin/usbController";
   QStringList arguments;
   arguments <<lineEdit_1->text()<<" "<<lineEdit_2->text()<<" "<< "system_u:object_r:removable_t:"<<lineEdit_3->text()<<" "<<lineEdit_4->text()<<" "
            <<lineEdit_5->text()<<" "<<lineEdit_6->text();
   QProcess *myProcess = new QProcess(parent);
   myProcess->start(program, arguments);
}

Но команда не выполняется.
Что делаю не так? И как можно сделать, если в консоли на данную команду появляется ошибка, что бы появлялось сообщение об этой ошибке? например в виде QMessagebox.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: KrupaKarlo от Январь 30, 2012, 10:57
Какая ошибка у тебя?  Скорее всего проблема в некорректной обработке аргументов в запускаемой программе


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 11:08
дело в том что ошибку никуда не пишет... как ее можно просмотреть?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 30, 2012, 12:05
Код
C++ (Qt)
QObject *parent;
...
QProcess *myProcess = new QProcess(parent);
 

С парентом это фееричный бред


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 30, 2012, 12:17
1) Путь к команде правильный? попробуй указать абсолютный путь, для начала
2) в arguments не надо пробелы добавлять как отдельные айтемы. При вызове команды QProcess сам проставит пробелы между аргументами из списка


Название: Re: Как при нажатии кнопки выполнить консоль&
Отправлено: wildcat от Январь 30, 2012, 12:34
Сделал так:
Код
C++ (Qt)
QString program = "/sbin/usbController";
QStringList arguments;
arguments <<lineEdit_1->text()<<lineEdit_2->text()<<"system_u:object_r:removable_t:"<<lineEdit_3->text()<<lineEdit_4->text()<<lineEdit_5->text()<<lineEdit_6->text();
QProcess *myProcess = new QProcess();
myProcess->start(program, arguments);
 

Все собирается нормально, но команда не выполняется, и ошибок нет.

При отладке:

Отладка запущена
&"warning: GDB: Failed to set controlling terminal: \320\235\320\265\320\264\320\276\320\277\321\203\321\201\321\202\320\270\320\274\321\213\320\271 \320\260\321\200\320\263\321\203\320\274\320\265\320\275\321\202\n"

Не пойму что за проблема.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 30, 2012, 12:41
из консоли команда твоя выполняется нормально?
попробуй у QProcess подписаться на error
ну и это попробуй QByteArray QProcess::readAllStandardOutput ()


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 13:42
Если запустить бинарник qt из консили. он запускается но в консоль пишет:

QGtkStyle was unable to detect the current GTK+ theme.
Qt: Session management error: None of the authentication protocols specified are supported
Ошибка сегментирования (core dumped)

Сама команда из  консоли прекрасно работает.

Сделал так:
 
Код
C++ (Qt)
void usbController::buttonBox_ok()
{
   QString program = "/sbin/usbController";
   QStringList arguments;
   arguments <<"add"<<" "<<lineEdit_1->text()<<lineEdit_2->text()<<"system_u:object_r:removable_t:"<<lineEdit_3->text()<<lineEdit_4->text()<<lineEdit_5->text()<<lineEdit_6->text();
   p_usbController->start(program, arguments);
 
   connect(p_usbController, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()));
   connect(p_usbController, SIGNAL(readyReadStandardError()), SLOT(slotDataOnStdout()));
}
 
void usbController::slotDataOnStdout()
{
   textEdit->append(p_usbController->readAllStandardOutput());
   textEdit_2->append(p_usbController->readAllStandardError());
}

После заполнения формы и нажатия кнопки:
Программа неожиданно завершилась.
/home/Qtproject/usb_1/usb_1 завершился с кодом 0


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 30, 2012, 14:08
другая команда (например cp) нормально запускается?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 14:09
В отладчике пишет что:

Приложение остановлено, так как оно получило сигнал от операционной системы.
Сигнал: SIGSEGV
Назначение: Segmentation fault


это происходит на:  p_usbController->start(program, arguments);

Это сигнал наступает при нарушении прав доступа, изменил права к всем файлам программы usbController. Запускал бинарник QT из под рута, все равно ошибка:

Qt: Session management error: None of the authentication protocols specified are supported
Ошибка сегментирования (core dumped)



Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: Пантер от Январь 30, 2012, 14:10
А сам p_usbController создан?


Название: Re: Как при нажатии кнопки выполнить консоль&
Отправлено: mutineer от Январь 30, 2012, 14:16
В отладчике пишет что:

Приложение остановлено, так как оно получило сигнал от операционной системы.
Сигнал: SIGSEGV
Назначение: Segmentation fault

Это сигнал наступает при нарушении прав доступа

Прав доступа к памяти, а не к файлам, вроде как

Qt: Session management error: None of the authentication protocols specified are supported

Эта ошибка замечательно гуглится


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 14:19
Делаю просто так, дабы проверить выполнение команды:

Код
C++ (Qt)
QString program = "/bin/ls";
   QStringList arguments;
   arguments <<"/";
   p_usbController->start(program, arguments);
   connect(p_usbController, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()));
   connect(p_usbController, SIGNAL(readyReadStandardError()), SLOT(slotDataOnStdout()));

Выводит: Приложение остановлено, так как оно получило сигнал от операционной системы.
Сигнал: SIGSEGV
Назначение: Segmentation fault


Все создал в *.h файле.
Код
C++ (Qt)
class usbController : public QDialog, public Ui::usbController
{
   Q_OBJECT
public:
   usbController(QWidget *parent = 0);
   QProcess* p_usbController;
public slots:
   void Changedtext();
   void buttonBox_ok();
   void slotDataOnStdout();
 
};


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 30, 2012, 14:20
QProcess* p_usbController;

Указатель создал, да. А сам объект где создается?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: Пантер от Январь 30, 2012, 14:34
p_usbController = new QProcess


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 14:46
спасибо, понял ошибку, команда ls заработала, и выводит результат в textEdit.

но, команда usbController add не работает.
Код
C++ (Qt)
p_usbController = new QProcess();
   QString program = "/sbin/usbController";
   QStringList arguments;
   arguments <<"add"<<" "<<lineEdit_1->text()<<lineEdit_2->text()<<"system_u:object_r:removable_t:"<<lineEdit_3->text()<<lineEdit_4->text()<<lineEdit_5->text()<<lineEdit_6->text();
   p_usbController->start(program, arguments);


Название: Re: Как при нажатии кнопки выполнить консоль&
Отправлено: mutineer от Январь 30, 2012, 14:56
как должен выглядеть вызов usbController из консоли и какое содержимое лайнэдитов?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 15:06
Вот так:
usbController add <название> <серия> <контекст_безопасности> <owner> <group> <атрибуты доступа>

usbController add flash 123 system_u:object_r:removable_t:s0 user user 0077


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 30, 2012, 15:09
Код
C++ (Qt)
arguments <<"add"<<" "<<lineEdit_1->text()<<lineEdit_2->text()<<"system_u:object_r:removable_t:"<<lineEdit_3->text()<<lineEdit_4->text()<<lineEdit_5->text()<<lineEdit_6->text();
   p_usbController->start(program, arguments);

Это будет преобразовано в такой вызов (или похожий на него)

Код
Bash
usbController add " " flash 123 system_u:object_r:removable_t: s0 user user 0077
А это вроде как неправильно


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 15:15
Теперь понятно в чем дело, символ пробела возникает:

Код
C++ (Qt)
"system_u:object_r:removable_t:"<<lineEdit_3->text()


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 30, 2012, 15:17
и второй параметр тоже (" ") какой-то странный


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Январь 30, 2012, 15:39
как можно избавится от лишнего пробела?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Январь 30, 2012, 15:42
Ну пипец...

Код
C++ (Qt)
QString param("system_u:object_r:removable_t:");
param.append(lineEdit_3->text());
...
arguments << ... << lineEdit_2->text() << param << lineEdit_4->text() <<...;
 


Название: Re: Как при нажатии кнопки выполнить консоль&
Отправлено: wildcat от Январь 30, 2012, 15:52
СПАСИБО ВАМ ОГРОМНОЕ, ВСЕ ЗАРАБОТАЛО!!!  :)

Код
C++ (Qt)
void usbController::buttonBox_ok()
{
   p_usbController = new QProcess();
   QString program = "/sbin/usbController";
   QStringList arguments;
   QString se_context("system_u:object_r:removable_t:");
   se_context.append(lineEdit_3->text());
   arguments <<"add"<<lineEdit_1->text()<<lineEdit_2->text()<<se_context<<lineEdit_4->text()<<lineEdit_5->text()<<lineEdit_6->text();
   p_usbController->start(program, arguments);
 
}
 


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Февраль 14, 2012, 10:52
Подскажите пожалуйста, что не так делаю?
Запускаю скрипт и хочу вывод скрипта вывести в textEdit. Выполняю:

Код
C++ (Qt)
    p_get_usb = new QProcess();
   QString get_usb = "/sbin/usb_storages.sh";
   p_get_usb->start(get_usb);
   textEdit->append(p_get_usb->readAllStandardOutput());
 

вывод не заносится в textEdit


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: BRE от Февраль 14, 2012, 10:59
Нужно дождаться, что бы запускаемая программа что-то вывела в пайп.


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Февраль 14, 2012, 11:12
вот так делаю тоже ноль...

Код
C++ (Qt)
void usbController::s_addComboBox()
{
   p_get_usb = new QProcess();
   QString get_usb = "/sbin/usb_storages.sh";
   connect(p_get_usb, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()));
   connect(p_get_usb, SIGNAL(readyReadStandardError()), SLOT(slotDataOnStdout()));
 
 
}
 
void usbController::slotDataOnStdout()
{
   textEdit->append(p_get_usb->readAllStandardOutput());
   textEdit->append(p_get_usb->readAllStandardError());
 
}

сам скрипт в консоли на раз выполняется...


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Февраль 14, 2012, 11:20
и так..
   
Код
C++ (Qt)
p_get_usb = new QProcess();
   QString get_usb = "/sbin/usb_storages.sh";
   p_get_usb->start(get_usb);
   sleep(5);
   textEdit->append(p_get_usb->readAllStandardOutput());

может что то не так делаю?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: sudo от Февраль 14, 2012, 11:29
Пардон, тред прочитать не успел, только пару последних сообщений :)
У QProcess есть метод waitForFinished, поэтому можно обойтись без всяких слипов


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Февраль 14, 2012, 11:38
вот так делаю тоже ноль...

Код
C++ (Qt)
void usbController::s_addComboBox()
{
   p_get_usb = new QProcess();
   QString get_usb = "/sbin/usb_storages.sh";
   connect(p_get_usb, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()));
   connect(p_get_usb, SIGNAL(readyReadStandardError()), SLOT(slotDataOnStdout()));
 
 
}
 
void usbController::slotDataOnStdout()
{
   textEdit->append(p_get_usb->readAllStandardOutput());
   textEdit->append(p_get_usb->readAllStandardError());
 
}

сам скрипт в консоли на раз выполняется...
а где вызов start() ?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Февраль 14, 2012, 11:46
Да.. )) там start потерял, когда вырезал закоменченые строки.

Все получилось вот:
Код
C++ (Qt)
void usbController::s_addComboBox()
{
   comboBox->clear();
   p_get_usb = new QProcess();
   QString get_usb = "/sbin/usb_storages.sh";
   p_get_usb->start(get_usb);
   p_get_usb->waitForFinished(300);
   comboBox->addItem(p_get_usb->readAllStandardOutput());
}


Единственное. если в выводе не одна запись а две и идут в столбик, они заносятся в comboBox в одну строчку.
Подскажете как исправить или чем воспользоваться?


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: mutineer от Февраль 14, 2012, 11:54
Вычитывать в строку, разбивать, и добавлять в комбобокс как два айтема


Название: Re: Как при нажатии кнопки выполнить консольную команду?
Отправлено: wildcat от Февраль 14, 2012, 14:25
Получилось вот так:

Код
C++ (Qt)
comboBox->clear();
   p_get_usb = new QProcess();
   QString get_usb = "/sbin/usb_storages.sh";
   p_get_usb->start(get_usb);
   p_get_usb->waitForFinished(300);
   QStringList *list = new QStringList();
 
   QString item = p_get_usb->readAllStandardOutput();
   *list = item.split(QRegExp("\n"));
   for (int i = 0; i < list->size(); ++i)
   {
   QString b = list->at(i).toLocal8Bit().constData();
   qDebug()<<b;
   comboBox->addItem(b);
   }