2016-11-23 3 views
0

Мне нужно подключить QProcess к обработчику ошибок, но я не уверен, как передать строку ошибки в слот. Что ниже компиляции, но не работает.QProcess ReadAllStandardError()

QString MainWindow::RunProcess(QString cstring) 
{ 
QProcess *process = new QProcess(this); 
connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror(process::ReadAllStandardError()))) 
process->start(cstring);  
} 



void MainWindow::adberror(QString errtxt) 
{ 
    qDebug() << "error handler"; 
    qDebug() << errtxt; 
} 

Я могу вызвать ошибку процесса, но adberror() никогда не запускается.

При запуске в Output Application панели я вижу:

QObject::connect: No such slot MainWindow::adberror(process::ReadAllStandardError()) 
QObject::connect: (receiver name: 'MainWindow') 

редактировать: это Qt 5.6. Я сделал новый qmake/clean.

+0

первый, ваш сигнал и слот арг должны соответствовать .. второй , ReadAllStandardError в любом случае не будет готов! – HazemGomaa

ответ

0

у вас есть два варианта

1- ожидания перед считыванием выходного

QString MainWindow::RunProcess(QString cstring) 
{ 
    QProcess process; 
    process.start(cstring); 
    process.waitForFinished(); 
    QString str = process.readAllStandardOutput(); 
} 

2- сделать вас process переменную-член и удалить свой 1-ый аргумент от adberror. Так,

в RunProcess

connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror())) 

затем в adberror

QString str = process->readAllStandardOutput(); 

отметить, что в вашем коде у вас есть проблемы, так как ваш сигнал и слот арг не соответствовать .. Кроме того, ReadAllStandardError в любом случае не собирается!

Edit: больше кода для 2-го раствора

mainwindow.h

class MainWindow 
{ 
    private://methods 
     void adberror(); 

    private://attributes 
     QProcess* process; 

}; 

mainwindow.cpp

QString MainWindow::RunProcess(QString cstring) 
{ 
    process = new QProcess(this); 
    connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror())); 
    connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater())); 
    process->start(cstring);  
} 

void MainWindow::adberror() 
{ 
    QString str = process->readAllStandardOutput(); 
    qDebug() << str; 
} 
+0

process-> readAllStandardOutput(); сбой при компиляции, adberror() не знает, что это такое. – Alan

+0

@Alan Вот почему в моем ответе я упомянул, что вам нужно сделать ** обрабатывать переменную-член ** MainWindow – HazemGomaa

+0

Спасибо HG. Я был бы признателен, если бы вы могли объяснить, как это делается.Как я уже упоминал выше, я могу добавить «процесс QProcess»; в моем mainwindow.cpp до MainWindow :: MainWindow. »и он работает, но я не думаю, что это то, что вы имеете в виду. – Alan

0

Для обработки сигнала readyReadStandardError() вы должны определить слот, как:

private slots: 
    void adberror(); 

и использовать его:

connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror())); 

т.е. без аргументов. Храните дочерний процесс как поле вашего класса MainWindow для чтения данных, когда он будет доступен.

+0

Что вы подразумеваете под «Сохранить дочерний процесс как поле вашего класса MainWindow»? Я могу добавить «процесс QProcess»; до MainWindow :: MainWindow ..., и он работает, но я не думаю, что это то, что вы предлагаете, является глобальным. Очень нуб, извините. – Alan

+0

@Alan Чтобы получить дополнительную информацию о членах поля и других функциях класса C++, прочитайте спецификацию [«Объявление класса»] (http://en.cppreference.com/w/cpp/language/class). Самая интересная часть для вас - * Спецификация участника *. – Nikita

Смежные вопросы