如何使用QSignalMapper传递参数,不兼容的发送方/接收方参数

时间:2015-09-24 15:09:48

标签: c++ qt qprocess

实现:

 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);

当我打电话给连接时,我得到了这个错误,这告诉我我做错了:

“QObject :: connect:不兼容的发送方/接收方参数                                                QSignalMapper :: mapped(int) - &gt;测试:: registerProcess(QString的)“

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

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

1 个答案:

答案 0 :(得分:2)

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)));

更新

在深入审核代码流后,我怀疑您希望将mapper连接到registerProcess()广告位而不是pidOut()。在该广告位中,您可以将QString id作为参数传递给signalMapper setMapping()中的QSignalMapper。这是使用id

的目的

但是,除了console之外,无法提取sender()指针,因为在这种情况下signalMapperQSignalMapper对象。如果是这种情况,console无法帮助您。您应该在this上使用readReadythis的直接连接(当然,void的广告位readReady()参数为id。要在该插槽中获取字符串QMap<QProces*, QString> map,可以使用存储为Test类成员的简单// addProcessToList(...): map[console] = id; //registerProcess(): QString id = map[console]; //processFinished(...): map.remove(console);

QSignalMapper

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