gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:49:07 25 4
gpt4 key购买 nike

实现:

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

原型(prototype):

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

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

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

“QObject::connect:不兼容的发送方/接收方参数 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 作为参数已传递给 signalMappersetMapping()称呼。这就是使用 QSignalMapper 的目的。 .

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

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

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

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

顺便说一下,不需要创建QSignalMapper 的新实例。对于每个 map 项。

关于c++ - 如何使用 QSignalMapper 传递参数,不兼容的发送方/接收方参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32764896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com