如何使用 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
上使用 console
和 this
的直接连接(当然,使用 this
的插槽和 void
参数作为 readReady()
)。要在该插槽中获取字符串 id
,可以使用简单的 QMap<QProces*, QString> map
存储为 Test
class 成员。
// addProcessToList(...):
map[console] = id;
//registerProcess():
QString id = map[console];
//processFinished(...):
map.remove(console);
顺便说一下,不需要为每个地图项创建一个新的 QSignalMapper
实例。
实施:
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
上使用 console
和 this
的直接连接(当然,使用 this
的插槽和 void
参数作为 readReady()
)。要在该插槽中获取字符串 id
,可以使用简单的 QMap<QProces*, QString> map
存储为 Test
class 成员。
// addProcessToList(...):
map[console] = id;
//registerProcess():
QString id = map[console];
//processFinished(...):
map.remove(console);
顺便说一下,不需要为每个地图项创建一个新的 QSignalMapper
实例。