Russian Qt Forum
Ноябрь 24, 2024, 08:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: Как при нажатии кнопки выполнить консольную команду?  (Прочитано 23345 раз)
wildcat
Гость
« Ответ #30 : Январь 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.
Записан
KrupaKarlo
Гость
« Ответ #31 : Январь 30, 2012, 10:57 »

Какая ошибка у тебя?  Скорее всего проблема в некорректной обработке аргументов в запускаемой программе
Записан
wildcat
Гость
« Ответ #32 : Январь 30, 2012, 11:08 »

дело в том что ошибку никуда не пишет... как ее можно просмотреть?
Записан
mutineer
Гость
« Ответ #33 : Январь 30, 2012, 12:05 »

Код
C++ (Qt)
QObject *parent;
...
QProcess *myProcess = new QProcess(parent);
 

С парентом это фееричный бред
Записан
mutineer
Гость
« Ответ #34 : Январь 30, 2012, 12:17 »

1) Путь к команде правильный? попробуй указать абсолютный путь, для начала
2) в arguments не надо пробелы добавлять как отдельные айтемы. При вызове команды QProcess сам проставит пробелы между аргументами из списка
Записан
wildcat
Гость
« Ответ #35 : Январь 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"

Не пойму что за проблема.
« Последнее редактирование: Январь 30, 2012, 12:39 от wildcat » Записан
mutineer
Гость
« Ответ #36 : Январь 30, 2012, 12:41 »

из консоли команда твоя выполняется нормально?
попробуй у QProcess подписаться на error
ну и это попробуй QByteArray QProcess::readAllStandardOutput ()
Записан
wildcat
Гость
« Ответ #37 : Январь 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
Записан
mutineer
Гость
« Ответ #38 : Январь 30, 2012, 14:08 »

другая команда (например cp) нормально запускается?
Записан
wildcat
Гость
« Ответ #39 : Январь 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)

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #40 : Январь 30, 2012, 14:10 »

А сам p_usbController создан?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mutineer
Гость
« Ответ #41 : Январь 30, 2012, 14:16 »

В отладчике пишет что:

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

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

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

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

Эта ошибка замечательно гуглится
Записан
wildcat
Гость
« Ответ #42 : Январь 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();
 
};
Записан
mutineer
Гость
« Ответ #43 : Январь 30, 2012, 14:20 »

QProcess* p_usbController;

Указатель создал, да. А сам объект где создается?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #44 : Январь 30, 2012, 14:34 »

p_usbController = new QProcess
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.3 секунд. Запросов: 23.