将自定义参数传递到 Qt/C++ 中的插槽
Passing custom arguments to a slot in 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)));
}
我已经在 Google 上搜索过,我发现 QSignalMapper
用于将参数传递给插槽,但 QSignalMapper
仅可用于传递整数,QStrings
、QObjects
和 QWidgets
。我需要传递一个自定义小部件。我还读到有一些技巧可以将自定义小部件包装在结构或类似的东西中,但我对如何做到这一点感到很困惑。
有人能帮帮我吗?
在 Qt 5 和 C++11 中,您可以使用新的 lambda 语法:
connect(reply, &QNetworkReply::NetworkError, [this, Feed]() {
this->HttpImageError(Feed);
});
此处将槽函数的附加 Feed
参数添加到 lambda 捕获块。
仅供进一步了解...
我找到了该问题的另一个解决方案,实际上是为了传递一个自定义小部件,我已经对 QSignalMapper class 进行了子class(我还没有在大学学习过 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());
}
注意:我不知道这是 "elegant" 方法还是 subclassing 是否正确完成..(我在没有正确知识的情况下完成了)无论如何它是对我来说工作得很好! (奇迹发生了:D)
我希望这个 post 能帮助遇到同样问题的人!
再见,马泰奥。
我在尝试将自定义小部件传递到我的 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)));
}
我已经在 Google 上搜索过,我发现 QSignalMapper
用于将参数传递给插槽,但 QSignalMapper
仅可用于传递整数,QStrings
、QObjects
和 QWidgets
。我需要传递一个自定义小部件。我还读到有一些技巧可以将自定义小部件包装在结构或类似的东西中,但我对如何做到这一点感到很困惑。
有人能帮帮我吗?
在 Qt 5 和 C++11 中,您可以使用新的 lambda 语法:
connect(reply, &QNetworkReply::NetworkError, [this, Feed]() {
this->HttpImageError(Feed);
});
此处将槽函数的附加 Feed
参数添加到 lambda 捕获块。
仅供进一步了解... 我找到了该问题的另一个解决方案,实际上是为了传递一个自定义小部件,我已经对 QSignalMapper class 进行了子class(我还没有在大学学习过 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());
}
注意:我不知道这是 "elegant" 方法还是 subclassing 是否正确完成..(我在没有正确知识的情况下完成了)无论如何它是对我来说工作得很好! (奇迹发生了:D) 我希望这个 post 能帮助遇到同样问题的人!
再见,马泰奥。