2

我有一个简单的对象库,用于存储有关变量的附加数据。当我创建每个对象(用作变量)时,我想维护这些对象的 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 的自动连接功能,但没有运气。自动连接能力引用自以下:

自动连接

Qt 项目论坛

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

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

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

4

2 回答 2

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;
}
于 2013-11-06T16:30:39.493 回答
0

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

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

static QList<EZBool *> Objects;

Class EZBool will automatically populate the list with newly created objects:

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

This class is responsible for new EZBool objects creation.

class TestFB
{
public:
    void initialize()
    {
        new EZBool("MpOnCmd", false, IO_INPUT);
        new EZBool("ZeroSpeed", false, IO_INPUT);
    } 
};
于 2013-11-07T07:59:53.750 回答