我有一个简单的对象库,用于存储有关变量的其他数据。当我创建每个对象(用作变量)时,我想维护这些对象的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的自动连接功能,但没有运气。自动连接功能参考如下:
我不想在实例化每个新对象后手动连接每个信号。以下列方式:
connect(ezBool, SIGNAL(localEZBool_Created(EZBool*)),
this, SLOT(on_localEZBool_Created(EZBool*)));
有没有人有任何建议或建议?谢谢!
答案 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);
}
};