Название: Как при нажатии кнопки выполнить консольную команду? Отправлено: 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 Там же все есть:
Код
Название: 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: Код usbcontroller.cpp: Код main.cpp Код
Название: 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 Код
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Январь 27, 2012, 13:43 Код
Спасибо большое помогло. Правда когда только указываю для проверки один lineEdit: Код
Не пойму, это для каждого 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(); Вот создаю проверку и все вставляю в один слот: Код
только тогда вообще ничего не работает... 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 Спасибо большое)))
получилось вот так: Код
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: sudo от Январь 27, 2012, 18:04 Ой, зачем такие сложности
Код:
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Январь 30, 2012, 09:54 После заполнения всех lineEdit, хочу выполнить команду в консоли, lineEdit - параметры команды. Делаю так:
Код
Но команда не выполняется. Что делаю не так? И как можно сделать, если в консоли на данную команду появляется ошибка, что бы появлялось сообщение об этой ошибке? например в виде QMessagebox. Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: KrupaKarlo от Январь 30, 2012, 10:57 Какая ошибка у тебя? Скорее всего проблема в некорректной обработке аргументов в запускаемой программе
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Январь 30, 2012, 11:08 дело в том что ошибку никуда не пишет... как ее можно просмотреть?
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: mutineer от Январь 30, 2012, 12:05 Код
С парентом это фееричный бред Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: mutineer от Январь 30, 2012, 12:17 1) Путь к команде правильный? попробуй указать абсолютный путь, для начала
2) в arguments не надо пробелы добавлять как отдельные айтемы. При вызове команды QProcess сам проставит пробелы между аргументами из списка Название: Re: Как при нажатии кнопки выполнить консоль& Отправлено: wildcat от Январь 30, 2012, 12:34 Сделал так:
Код
Все собирается нормально, но команда не выполняется, и ошибок нет. При отладке: Отладка запущена &"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) Сама команда из консоли прекрасно работает. Сделал так: Код
После заполнения формы и нажатия кнопки: Программа неожиданно завершилась. /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 Делаю просто так, дабы проверить выполнение команды:
Код
Выводит: Приложение остановлено, так как оно получило сигнал от операционной системы. Сигнал: SIGSEGV Назначение: Segmentation fault Все создал в *.h файле. Код
Название: 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 не работает. Код
Название: 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 Код
Это будет преобразовано в такой вызов (или похожий на него) Код А это вроде как неправильно Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Январь 30, 2012, 15:15 Теперь понятно в чем дело, символ пробела возникает:
Код
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: mutineer от Январь 30, 2012, 15:17 и второй параметр тоже (" ") какой-то странный
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Январь 30, 2012, 15:39 как можно избавится от лишнего пробела?
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: mutineer от Январь 30, 2012, 15:42 Ну пипец...
Код
Название: Re: Как при нажатии кнопки выполнить консоль& Отправлено: wildcat от Январь 30, 2012, 15:52 СПАСИБО ВАМ ОГРОМНОЕ, ВСЕ ЗАРАБОТАЛО!!! :)
Код
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Февраль 14, 2012, 10:52 Подскажите пожалуйста, что не так делаю?
Запускаю скрипт и хочу вывод скрипта вывести в textEdit. Выполняю: Код
вывод не заносится в textEdit Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: BRE от Февраль 14, 2012, 10:59 Нужно дождаться, что бы запускаемая программа что-то вывела в пайп.
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Февраль 14, 2012, 11:12 вот так делаю тоже ноль...
Код
сам скрипт в консоли на раз выполняется... Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Февраль 14, 2012, 11:20 и так..
Код
может что то не так делаю? Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: sudo от Февраль 14, 2012, 11:29 Пардон, тред прочитать не успел, только пару последних сообщений :)
У QProcess есть метод waitForFinished, поэтому можно обойтись без всяких слипов Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: mutineer от Февраль 14, 2012, 11:38 вот так делаю тоже ноль... а где вызов start() ?Код
сам скрипт в консоли на раз выполняется... Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Февраль 14, 2012, 11:46 Да.. )) там start потерял, когда вырезал закоменченые строки.
Все получилось вот: Код
Единственное. если в выводе не одна запись а две и идут в столбик, они заносятся в comboBox в одну строчку. Подскажете как исправить или чем воспользоваться? Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: mutineer от Февраль 14, 2012, 11:54 Вычитывать в строку, разбивать, и добавлять в комбобокс как два айтема
Название: Re: Как при нажатии кнопки выполнить консольную команду? Отправлено: wildcat от Февраль 14, 2012, 14:25 Получилось вот так:
Код
|