簡體   English   中英

將自定義參數傳遞到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)));
}

我已經搜索在谷歌和我發現, QSignalMapper用於參數傳遞給插槽,但是QSignalMapper可用只是為了消磨整數, QStringsQObjectsQWidgets 我需要傳遞一個自定義小部件。 我還讀到有一些技巧可以將自定義窗口小部件包裝在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM