如何使用 QSignalMapper 传递参数,不兼容 sender/receiver 参数

How to pass a parameter using QSignalMapper, incompatible sender/receiver arguments

实施:

 void Test::addProcessToList(const QString &command, const QString &id, const BasicInfo &basicInfo) {
        QProcess *console = new QProcess();
        QSignalMapper* signalMapper = new QSignalMapper (this) ;
        connect (console, SIGNAL(readyRead()), signalMapper, SLOT(map())) ;
        connect (console, SIGNAL(finished(int)), signalMapper, SLOT(processFinished(int))) ;
        signalMapper->setMapping (console, id) ;
        connect (signalMapper, SIGNAL(mapped(int)), this, SLOT(pidOut(QString))) ;
        console->start(command);
    }

    void Test::registerProcess(QString id) {
        QProcess *console = qobject_cast<QProcess*>(QObject::sender());
        QByteArray processOutput = console->readAll();
        int mainPID = parsePID(processOutput);

        BasicInfo basicInfo;
        qDebug() << "Registering id: " + id + " mainPID: " + mainPID;
        if(mainPID != 0) {
            Main::getInstance()->addProcessToList(mainPID, packageId, basicInfo);
        } else {
            qWarning() << "pidOut Error fetching mainPID";
        }
    }


    void Test::processFinished(int exitCode) {
        QProcess *console = qobject_cast<QProcess*>(QObject::sender());
        QByteArray processOutput = console->readAll() + QString("Finished with code %1").arg(exitCode).toLatin1();
        qDebug() << " processFinished: " + processOutput;
    }

原型:

private
    void addProcessToList(const QString &command, const QString &id, const BasicInfo &basicInfo);

private slots:
    void registerProcess(QString);
    void processFinished(int);

我在调用 connect 时遇到此错误,这告诉我我做错了:

"QObject::connect: 不兼容 sender/receiver 参数 QSignalMapper::mapped(int) --> Test::registerProcess(QString)"

我不明白应该在哪里指定我的参数 (QString id),以便 registerProcess 在调用时接收它?我假设我做错了这部分,从上面截下来:

signalMapper->setMapping (console, id) ;
        connect (signalMapper, SIGNAL(mapped(int)), this, SLOT(pidOut(QString))) ;

QSignalMapper 可以发出 mapped(const QString & text)mapped(int i) 信号。类型由 setMapping(QObject * sender, int id)setMapping(QObject * sender, const QString & text).

定义

这可能是由于

中的自动完成导致的混淆
connect (signalMapper, SIGNAL(mapped(int)), this, SLOT(pidOut(QString)));

信号和槽的类型必须相同才能连接。

你设置了字符串映射(QString &id),所以连接中的信号应该是QString:

connect (signalMapper, SIGNAL(mapped(QString)), this, SLOT(pidOut(QString)));

更新

在深入审查代码流后,我怀疑您想要将映射器连接到 registerProcess() 插槽而不是 pidOut()。在该插槽中,您可以将 QString id 作为参数传递给 setMapping() 调用中的 signalMapper。这就是使用 QSignalMapper.

的目的

然而,除此之外 id 不可能提取 console 指针,因为在那种情况下 sender()signalMapper 对象。如果是这样,QSignalMapper 帮不了你。您应该在 readReady 上使用 consolethis 的直接连接(当然,使用 this 的插槽和 void 参数作为 readReady())。要在该插槽中获取字符串 id,可以使用简单的 QMap<QProces*, QString> map 存储为 Test class 成员。

// addProcessToList(...):
map[console] = id;

//registerProcess():
QString id = map[console];

//processFinished(...):
map.remove(console);

顺便说一下,不需要为每个地图项创建一个新的 QSignalMapper 实例。