实现:
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))) ;
答案 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()
指针,因为在这种情况下signalMapper
是QSignalMapper
对象。如果是这种情况,console
无法帮助您。您应该在this
上使用readReady
和this
的直接连接(当然,void
的广告位readReady()
参数为id
。要在该插槽中获取字符串QMap<QProces*, QString> map
,可以使用存储为Test
类成员的简单// addProcessToList(...):
map[console] = id;
//registerProcess():
QString id = map[console];
//processFinished(...):
map.remove(console);
。
QSignalMapper
顺便说一句,不需要为每个地图项创建beforeunload
的新实例。