[英]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)));
}
我已經搜索在谷歌和我發現, QSignalMapper
用於參數傳遞給插槽,但是QSignalMapper
可用只是為了消磨整數, QStrings
, QObjects
和QWidgets
。 我需要傳遞一個自定義小部件。 我還讀到有一些技巧可以將自定義窗口小部件包裝在struct之類的東西中,但是我對如何做到這一點感到非常困惑。
有人可以幫助我嗎?
通過Qt 5和C ++ 11,您可以使用新的lambda語法:
connect(reply, &QNetworkReply::NetworkError, [this, Feed]() {
this->HttpImageError(Feed);
});
此處,插槽功能的其他Feed
參數添加到了lambda捕獲塊。
只是為了獲取更多信息...我找到了解決該問題的另一種方法,實際上是通過傳遞一個自定義小部件,我將其子類化為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());
}
注意:我不知道這是不是“優雅”的方法還是子類化是否正確完成了。(我沒有正確的方法就完成了它)對我來說一切正常! (奇跡發生了:D)我希望這篇文章能對遇到同樣問題的人有所幫助!
再見,Matteo。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.