将自定义参数传递到Qt/C++中的插槽



我在尝试将自定义小部件传递到Qt应用程序中的自定义插槽时遇到了一些问题。

这里有一个我需要的例子:(注意插槽)

void MainWindow::HttpRequest(const QString & URL, QCustomWidget *Feed) {
    manager = new QNetworkAccessManager(this);
    reply = manager->get(QNetworkRequest(QUrl(URL)));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(HttpImageError(Feed)));
    connect(reply, SIGNAL(finished()), this, SLOT(HttpImageFinished(Feed)));
}

我已经在谷歌上搜索过了,发现QSignalMapper用于向槽传递参数,但QSignalMapper仅用于传递整数QStringsQObjectsQWidgets。我需要传递一个自定义小部件。我也读到过一些技巧可以将自定义小部件封装在结构或类似的东西中,但我对如何做到这一点非常困惑。

有人能帮我吗?

使用Qt 5和C++11,您可以使用新的lambda语法:

connect(reply, &QNetworkReply::NetworkError, [this, Feed]() {
    this->HttpImageError(Feed);
});

在这里,槽函数的附加Feed参数被添加到lambda捕获块。

仅了解更多信息。。。我找到了这个问题的另一个解决方案,事实上,通过一个自定义小部件,我已经将QSignalMapper类子类化了(我还没有在大学学习OOP,所以请耐心等待!:P),这里有一些代码:

Q自定义应用程序h

#ifndef QCUSTOMMAPPER_H
#define QCUSTOMMAPPER_H
#include <QSignalMapper>
#include <QHash>
#include "customwidget.h"
class QCustomMapper : public QSignalMapper
{
    Q_OBJECT
public:
    explicit QCustomMapper(QObject *parent = 0);
    void setMapping(QObject *sender, CustomWidget *customWidget);
    void removeMappings(QObject *sender);
    QHash<QObject *, CustomWidget *> customHash;
Q_SIGNALS:
    void mapped(CustomWidget *);
public slots:
    void senderDestroyed() {
        removeMappings(sender());
    }
    void map(QObject *sender);
    void map();
};
#endif // QCUSTOMMAPPER_H

Q自定义映射.cpp

#include "qcustommapper.h"
QCustomMapper::QCustomMapper(QObject *parent) : QSignalMapper(parent) {
}
void QCustomMapper::setMapping(QObject *sender, CustomWidget *customWidget) {
    customHash.insert(sender, customWidget);
    connect(sender, SIGNAL(destroyed()), this, SLOT(senderDestroyed()));
}
void QCustomMapper::removeMappings(QObject *sender) {
    customHash.remove(sender);
}
void QCustomMapper::map(QObject *sender) {
    if (customHash.contains(sender)) {
        emit mapped(customHash.value(sender));
    }
}
void QCustomMapper::map() {
    map(sender());
}

注意:我不知道这是一个"优雅"的方法,还是子类化做得正确。。(我做这件事没有正确的节疤)不管怎样,它对我来说很好!(奇迹发生:D)我希望这篇文章能帮助到有同样问题的人!

再见,马特奥。

最新更新