Qt自动将新对象的信号连接到现有插槽

时间:2013-11-06 15:58:12

标签: qt signals-slots qt-signals

我有一个简单的对象库,用于存储有关变量的其他数据。当我创建每个对象(用作变量)时,我想维护这些对象的QList。有没有办法自动将所有新创建的对象的信号连接到一个插槽。该插槽属于我的应用程序中的对象。

对象标题 ezbool.h

class EZBool : public QObject
{
    Q_OBJECT
public:
    explicit EZBool(QObject *parent = 0);
    EZBool(QString boolName, bool initialValue, IOTYPE type);   
    //Removed Member Functions      
signals:
    void localEZBool_Created(EZBool *me);
private:
    QString name;
    bool value;
    IOTYPE ioType;
};

对象构造函数 ezbool.cpp

EZBool::EZBool(QString boolName, bool initialValue, IOTYPE type)
{
    name = boolName;
    value = initialValue;
    ioType = type;
    emit localEZBool_Created(this);
}

广告位实施 fbtest.cpp

void TestFB::on_localEZBool_Created(EZBool *newVar)
{
    qDebug() << "Auto Connect worked??";
    //Handle new variable by adding to QList
}

fbtest.cpp

中以下列方式创建对象
void TestFB::initialize()
{
    mpOnCmd     = new EZBool("MpOnCmd", false, IO_INPUT);
    zeroSpeed   = new EZBool("ZeroSpeed", false, IO_INPUT);

}

我尝试过匹配Qt的自动连接功能,但没有运气。自动连接功能参考如下:

Automatic Connections

Qt Project Forums

我不想在实例化每个新对象后手动连接每个信号。以下列方式:

connect(ezBool, SIGNAL(localEZBool_Created(EZBool*)),
        this, SLOT(on_localEZBool_Created(EZBool*)));

有没有人有任何建议或建议?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在TestFB中覆盖childEvent,然后对ChildAdded

作出反应
void TestFB::childEvent(QChildEvent * event)
{
    if(event.added())
    {
        EZBool child = qobject_cast<EZBool*>(event.child());
        if(child)
        {
            qDebug() << "Auto Connect worked??";
            //Handle new variable by adding to QList
        }
    }
}

这需要将EZBool的父级设置为TestFB(最好是在构造函数中)

mpOnCmd     = new EZBool("MpOnCmd", false, IO_INPUT, this);
zeroSpeed   = new EZBool("ZeroSpeed", false, IO_INPUT, this);

并将QObject *parent=0参数添加到自定义构造函数并将其传递给超类

EZBool::EZBool(QString boolName, bool initialValue, IOTYPE type, QObject p)
: QObject(p)
{
    name = boolName;
    value = initialValue;
    ioType = type;
}

答案 1 :(得分:0)

要解决对象列表自动填充,我根本不会使用信号/插槽机制。它实际上似乎是来自QObject的过度杀伤和不必要的依赖。相反,我会建议以下解决方案,IMO,更简单。

定义将存储新创建的对象的列表。您可以随时阅读:

static QList<EZBool *> Objects;

EZBool将使用新创建的对象自动填充列表:

class EZBool
{
public:    
    EZBool(QString boolName, bool initialValue, IOTYPE type)
        :
            name(boolName),
            value(initialValue),
            ioType(type)
    {
        Objects.push_back(this);
    }
private:
    QString name;
    bool value;
    IOTYPE ioType;
};

此类负责创建新的EZBool对象。

class TestFB
{
public:
    void initialize()
    {
        new EZBool("MpOnCmd", false, IO_INPUT);
        new EZBool("ZeroSpeed", false, IO_INPUT);
    } 
};