Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Павелъ от Март 01, 2018, 14:40



Название: Передать сигнал в функцию возможно?
Отправлено: Павелъ от Март 01, 2018, 14:40
Доброго времени суток.

В общем писал, писал много говнокода. И тут заметил, что все функции имеют одинаковый вид.

То есть есть аргумент для QProcess.
Указатель на QProcess.

И сигнал.

И собственно, что я копипастю, ведь можно просто написать одну функцию и вызывать из этих похожих функций с аргументами.

Указатель на QProcess и аргумент типа QString передать проблем нет. Но, что делать с сигналом?

Нет, конечно можно создать 20-этажный условный оператор по аргументам и посылать из него для каждого случая свой сигнал. Но, разве это красиво?

Пошёл следующим путём. Объявил тип:

Код:
typedef void (*SIG)(QString,QString);

Метод:

Код:
void dmidecodeS(QProcess *proc, QString argument,SIG sig);

Код:
void IpItem::dmidecodeS(QProcess *proc, QString argument, SIG sig)
{
    proc = new QProcess();

    if(CommonFunctions::isIpExistsInList(_address,_ipListThisDevice))
    {
        proc->setProgram("sudo");
        proc->setArguments(QStringList() << "dmidecode" << "-s" << argument);
    }
    else
    {
        _ipSettings.userName = "pavel";
        _ipSettings.password = "password";

        proc->setProgram("sshpass");
        proc->setArguments(QStringList() << "-p" << _ipSettings.password << "ssh" << "-o" << "StrictHostKeychecking=no" << _ipSettings.userName + "@" + _address << "sudo" << "dmidecode" << "-s" << argument);
    }

    connect(proc,&QProcess::readyReadStandardOutput,[=](){
       // emit signalSystemVersion(_address,proc->readAllStandardOutput().trimmed());

        emit sig(_address,proc->readAllStandardOutput().trimmed());


    });


    connect(proc,static_cast<void (QProcess::*)(int)>(&QProcess::finished),[=](int)mutable{

        if(proc->isOpen())
        {
            proc->close();
        }
        proc->deleteLater();
        proc = NULL;
    });

    proc->open();
}


Пробую передать в аргументы функции сигнал:

Код:
dmidecodeS(_biosVersionProc,"bios-version",&IpItem::signalBiosVersion);

Получаю ошибку:

Код:
/home/pavel/newnetmonitor/newNetMonitor/ipitem.cpp:781: ошибка: no matching function for call to ‘IpItem::dmidecodeS(QProcess*&, const char [13], void (IpItem::*)(QString, QString))’
     dmidecodeS(_biosVersionProc,"bios-version",&IpItem::signalBiosVersion);
                                                                          ^

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

Есть решение?

PS

Забыл про сигнал, который пытаюсь передать, вот он:

Код:
void signalBiosVersion(QString ip,QString version);


Название: Re: Передать сигнал в функцию возможно?
Отправлено: ViTech от Март 01, 2018, 15:12
Объявил тип:
Код:
typedef void (*SIG)(QString,QString);
Это указатель на функцию.

Пробую передать в аргументы функции сигнал:
Код:
dmidecodeS(_biosVersionProc,"bios-version",&IpItem::signalBiosVersion);
А тут указатель на метод класса.

Подробности здесь: Pointers to Member Functions (https://isocpp.org/wiki/faq/pointers-to-members).