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

时间:2015-04-06 14:22:57

标签: c++ qt signals-slots qwidget

我在尝试将自定义小部件传递到我的Qt App中的自定义插槽时遇到了一些麻烦。

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

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

我已在Google上搜索过,我发现QSignalMapper用于将参数传递给广告位,但QSignalMapper仅可用于传递整数,QStrings,{{ 1}}和QObjects。我需要传递一个自定义小部件。我还读到有一些技巧可以将自定义小部件包装在结构体中或类似的东西中,但我对如何做到这一点感到很困惑。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

QCustomMapper.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

QCustomMapper.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());
}

注意:我不知道这是否是一个优雅的&#34;方法或如果子类化正确完成..(我没有正确的知识就完成了)无论如何它对我来说都很好! (奇迹发生:D) 我希望这篇文章能帮助那些有同样问题的人!

再见,马特奥。

相关问题