Russian Qt Forum
Март 29, 2024, 05:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передать сигнал в функцию возможно?  (Прочитано 1946 раз)
Павелъ
Гость
« : Март 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);
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Март 01, 2018, 15:12 »

Объявил тип:
Код:
typedef void (*SIG)(QString,QString);
Это указатель на функцию.

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

Подробности здесь: Pointers to Member Functions.
Записан

Пока сам не сделаешь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 22.