Доброго времени суток.
В общем писал, писал много
говнокода. И тут заметил, что все функции имеют одинаковый вид.
То есть есть аргумент для 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);