LINUX.ORG.RU

Qt5 to Qt6 проблемы

 , ,


0

1

Есть такой простенький класс - обертка для QProcess:

namespace Ui {
    class Proc;
}

class Proc : public QObject {
    Q_OBJECT

public:
    explicit Proc( QObject *parent=0 );
    virtual ~Proc();

private:
    QProcess        *process;

public:
    void        startProcess (QString binaryPath);
    void        sendCommand (QString command);

private slots:
    void        readFromProcess();
    void        errorFound(QProcess::ProcessError err);

signals:
    void        messageRecieved(QString);
    void        processFault(QProcess::ProcessError);
    void        processStarted();
    void        processFinished(int exitCode, QProcess::ExitStatus exitStatus);
};


Proc::Proc(QObject* parent) : QObject (parent) {
    process = new QProcess(this);
    process->setReadChannel(QProcess::StandardOutput);
    connect (process, SIGNAL(readyRead()), SLOT(readFromProcess()));
    connect (process, SIGNAL(errorOccurred(QProcess::ProcessError)), this, SLOT(errorFound(QProcess::ProcessError)));
    connect (process, SIGNAL(started()), SLOT(processStarted()));
    connect (process, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(processFinished(int, QProcess::ExitStatus)));
}

void Proc::startProcess (QString binaryPath){
    process->start(binaryPath);
}

void Proc::sendCommand (QString command){
    process->write(command.toLatin1());

}

void Proc::readFromProcess(){
    while (process->canReadLine()){
        QString line = QString::fromLatin1(process->readLine());
        emit messageRecieved(line);
    }
}

void Proc::errorFound(QProcess::ProcessError err){
    emit processFault(err);
}

void Proc::processStarted(){
    qDebug()<<"started";
}
void Proc::processFinished(int exitCode, QProcess::ExitStatus status){
    qDebug()<<"finished";
}

Proc::~Proc(){

}

Запускаю процесс xinput и жду выхлопа:

xinput = new Proc();
connect(xinput, SIGNAL(messageRecieved(QString)), this, SLOT(xinputRecieved(QString)));
xinput->startProcess("xinput --test-xi2 --root");


xinputRecieved(QString msg){
    qDebug()<<msg;
}
До сих пор это работало (на qt5), выхлоп xinput приходил в слот xinputRecieved и там я его парсил как мне нужно.

Сегодня обновилась система и qt5 больше нету, только qt6. И с qt6 выхлоп xinput не приходит. Более того, xinput в списке процессов top вообще отсутствует. Хотя слот processStarted пишет, что процесс стартанул. Слот processFinished при этом молчит.

Что такого поменялось в qt6, что процесс xinput стал вести себя таким образом? Сам xinput будучи запущен вручную в консоли исправно работает.

★★★★★
Ответ на: комментарий от Chord

Думаю, правильнее их использовать все же (readyReadStandardError() и readyReadStandardOutput()). errorOccurred - это ошибка самого класса QProcess, а readyReadStandardError() это вывод запускаемой программы в поток ошибок, т.е. тебе нужно и то и то.

rumgot ★★★★★
()
Ответ на: комментарий от Chord

А, ну да.

Измени свою функцию на

void startProcess(QString binaryPath, QStringList args);

А в ней уже:

void Proc::startProcess (QString binaryPath, QStringList args){
    process->start(binaryPath, args);
}

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)

Тут изначально (сразу при переходе на qt6) была ошибка, связанная с QByteArray вот в этой строке:

process->write(command.toLatin1());
Пока искал решение, эта ошибка куда-то пропала, хотя изменений в коде не производил. И появилась эта ерунда с xinput

Chord ★★★★★
() автор топика

Лучше использовать новый стиль в connect вместо макросов SIGNAL() и SLOT(). Тогда проблемы сразу на этапе компиляции вылезут, а не в рантайме.

ox55ff ★★★★★
()