本文整理汇总了C++中QObject::metaObject方法的典型用法代码示例。如果您正苦于以下问题:C++ QObject::metaObject方法的具体用法?C++ QObject::metaObject怎么用?C++ QObject::metaObject使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QObject
的用法示例。
在下文中一共展示了QObject::metaObject方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: qsignal
error *objectConnect(QObject_ *object, const char *signal, int signalLen, QQmlEngine_ *engine, void *func, int argsLen)
{
QObject *qobject = reinterpret_cast<QObject *>(object);
QQmlEngine *qengine = reinterpret_cast<QQmlEngine *>(engine);
QByteArray qsignal(signal, signalLen);
const QMetaObject *meta = qobject->metaObject();
// Walk backwards so descendants have priority.
for (int i = meta->methodCount()-1; i >= 0; i--) {
QMetaMethod method = meta->method(i);
if (method.methodType() == QMetaMethod::Signal) {
QByteArray name = method.name();
if (name.length() == signalLen && qstrncmp(name.constData(), signal, signalLen) == 0) {
if (method.parameterCount() < argsLen) {
// TODO Might continue looking to see if a different signal has the same name and enough arguments.
return errorf("signal \"%s\" has too few parameters for provided function", name.constData());
}
Connector *connector = new Connector(qobject, method, qengine, func, argsLen);
const QMetaObject *connmeta = connector->metaObject();
QObject::connect(qobject, method, connector, connmeta->method(connmeta->methodOffset()));
return 0;
}
}
}
// Cannot use constData here as the byte array is not null-terminated.
return errorf("object does not expose a \"%s\" signal", qsignal.data());
}
示例2: contextProperty
/*!
Returns the value of the \a name property for this context
as a QVariant.
*/
QVariant QQmlContext::contextProperty(const QString &name) const
{
Q_D(const QQmlContext);
QVariant value;
int idx = -1;
QQmlContextData *data = d->data;
const QV4::IdentifierHash<int> &properties = data->propertyNames();
if (properties.count())
idx = properties.value(name);
if (idx == -1) {
if (data->contextObject) {
QObject *obj = data->contextObject;
QQmlPropertyData local;
QQmlPropertyData *property =
QQmlPropertyCache::property(data->engine, obj, name, data, local);
if (property) value = obj->metaObject()->property(property->coreIndex()).read(obj);
}
if (!value.isValid() && parentContext())
value = parentContext()->contextProperty(name);
} else {
if (idx >= d->propertyValues.count())
value = QVariant::fromValue(data->idValues[idx - d->propertyValues.count()].data());
else
value = d->propertyValues[idx];
}
return value;
}
示例3: sender
int SignalProxy::SignalRelay::qt_metacall(QMetaObject::Call _c, int _id, void **_a) {
_id = QObject::qt_metacall(_c, _id, _a);
if(_id < 0)
return _id;
if(_c == QMetaObject::InvokeMetaMethod) {
if(_slots.contains(_id)) {
QObject *caller = sender();
SignalProxy::ExtendedMetaObject *eMeta = proxy()->extendedMetaObject(caller->metaObject());
Q_ASSERT(eMeta);
const Signal &signal = _slots[_id];
QVariantList params;
params << signal.signature;
const QList<int> &argTypes = eMeta->argTypes(signal.signalId);
for(int i = 0; i < argTypes.size(); i++) {
if(argTypes[i] == 0) {
qWarning() << "SignalRelay::qt_metacall(): received invalid data for argument number" << i << "of signal" << QString("%1::%2").arg(caller->metaObject()->className()).arg(caller->metaObject()->method(_id).signature());
qWarning() << " - make sure all your data types are known by the Qt MetaSystem";
return _id;
}
params << QVariant(argTypes[i], _a[i+1]);
}
proxy()->dispatchSignal(SignalProxy::RpcCall, params);
}
_id -= _slots.count();
}
return _id;
}
示例4: slotDebugTimeout
void BibleTime::slotDebugTimeout() {
QMutexLocker lock(&m_debugWindowLock);
if (m_debugWindow == 0 || m_debugWindow->isVisible() == false) return;
QTimer::singleShot(0, this, SLOT(slotDebugTimeout()));
QObject *w = QApplication::widgetAt(QCursor::pos());
if (w != 0) {
QString objectHierarchy;
do {
const QMetaObject *m = w->metaObject();
QString classHierarchy;
do {
if (!classHierarchy.isEmpty()) classHierarchy += ": ";
classHierarchy += m->className();
m = m->superClass();
} while (m != 0);
if (!objectHierarchy.isEmpty()) {
objectHierarchy += "<br/><b>child of:</b> ";
} else {
objectHierarchy += "<b>This widget is:</b> ";
}
objectHierarchy += classHierarchy;
w = w->parent();
} while (w != 0);
m_debugWindow->setText(objectHierarchy);
} else {
m_debugWindow->setText("No widget");
}
m_debugWindow->resize(m_debugWindow->minimumSizeHint());
}
示例5: AbstractParam
ParamEnum::ParamEnum( QObject *parent, const char* name, int value, const QString& e, int *ptr )
: AbstractParam(parent, name, QVariant::Int)
{
m_ptr = ptr;
QStringList L = e.split('|', QString::SkipEmptyParts);
if (!L.isEmpty()) {
for (int i = 0; i < L.size(); ++i) {
m_keys.append(L[i]);
m_values.append(i);
}
} else {
QObject *p = parent;
while (p) {
const QMetaObject *mo = p->metaObject();
int index = mo->indexOfEnumerator(e.toLatin1().data());
if (index >= 0) {
const QMetaEnum me = mo->enumerator(index);
for (int i = 0; i < me.keyCount(); ++i) {
m_keys.append(me.key(i));
m_values.append(me.value(i));
}
break;
}
p = p->parent();
}
}
m_value = m_defaultValue = value;
if (m_ptr) *m_ptr = m_value;
}
示例6: collectReachableMetaObjects
void collectReachableMetaObjects(QObject *object, QSet<const QMetaObject *> *metas)
{
if (! object)
return;
const QMetaObject *meta = object->metaObject();
if (verbose)
qDebug() << "Processing object" << meta->className();
collectReachableMetaObjects(meta, metas);
for (int index = 0; index < meta->propertyCount(); ++index) {
QMetaProperty prop = meta->property(index);
if (QQmlMetaType::isQObject(prop.userType())) {
if (verbose)
qDebug() << " Processing property" << prop.name();
currentProperty = QString("%1::%2").arg(meta->className(), prop.name());
// if the property was not initialized during construction,
// accessing a member of oo is going to cause a segmentation fault
QObject *oo = QQmlMetaType::toQObject(prop.read(object));
if (oo && !metas->contains(oo->metaObject()))
collectReachableMetaObjects(oo, metas);
currentProperty.clear();
}
}
}
示例7: getPropertyNames
void QtInstance::getPropertyNames(ExecState* exec, PropertyNameArray& array)
{
// This is the enumerable properties, so put:
// properties
// dynamic properties
// slots
QObject* obj = getObject();
if (obj) {
const QMetaObject* meta = obj->metaObject();
int i;
for (i = 0; i < meta->propertyCount(); i++) {
QMetaProperty prop = meta->property(i);
if (prop.isScriptable())
array.add(Identifier(exec, prop.name()));
}
#ifndef QT_NO_PROPERTIES
QList<QByteArray> dynProps = obj->dynamicPropertyNames();
foreach (const QByteArray& ba, dynProps)
array.add(Identifier(exec, ba.constData()));
#endif
const int methodCount = meta->methodCount();
for (i = 0; i < methodCount; i++) {
QMetaMethod method = meta->method(i);
if (method.access() != QMetaMethod::Private)
array.add(Identifier(exec, method.signature()));
}
}
}
示例8: propertyNames
QStringList QDeclarativeObjectScriptClass::propertyNames(Object *object)
{
QObject *obj = toQObject(object);
if (!obj)
return QStringList();
QDeclarativeEnginePrivate *enginePrivate = QDeclarativeEnginePrivate::get(engine);
QDeclarativePropertyCache *cache = 0;
QDeclarativeData *ddata = QDeclarativeData::get(obj);
if (ddata)
cache = ddata->propertyCache;
if (!cache) {
cache = enginePrivate->cache(obj);
if (cache) {
if (ddata) { cache->addref(); ddata->propertyCache = cache; }
} else {
// Not cachable - fall back to QMetaObject (eg. dynamic meta object)
// XXX QDeclarativeOpenMetaObject has a cache, so this is suboptimal.
// XXX This is a workaround for QTBUG-9420.
const QMetaObject *mo = obj->metaObject();
QStringList r;
int pc = mo->propertyCount();
int po = mo->propertyOffset();
for (int i=po; i<pc; ++i)
r += QString::fromUtf8(mo->property(i).name());
return r;
}
}
return cache->propertyNames();
}
示例9: equals
bool QtOnChangeWithKeepAliveSubscriptionQos::equals(const QObject& other) const
{
int typeThis = QMetaType::type(this->metaObject()->className());
int typeOther = QMetaType::type(other.metaObject()->className());
auto newOther = dynamic_cast<const QtOnChangeWithKeepAliveSubscriptionQos*>(&other);
return typeThis == typeOther && *this == *newOther;
}
示例10: connectTriggered
void SignalTransition::connectTriggered()
{
if (!m_complete || !m_cdata)
return;
QObject *target = senderObject();
QQmlData *ddata = QQmlData::get(this);
QQmlContextData *ctxtdata = ddata ? ddata->outerContext : 0;
Q_ASSERT(m_bindings.count() == 1);
const QV4::CompiledData::Binding *binding = m_bindings.at(0);
Q_ASSERT(binding->type == QV4::CompiledData::Binding::Type_Script);
QV4::ExecutionEngine *jsEngine = QV8Engine::getV4(QQmlEngine::contextForObject(this)->engine());
QV4::Scope scope(jsEngine);
QV4::Scoped<QV4::QObjectMethod> qobjectSignal(scope, QJSValuePrivate::convertedToValue(jsEngine, m_signal));
Q_ASSERT(qobjectSignal);
QMetaMethod metaMethod = target->metaObject()->method(qobjectSignal->methodIndex());
int signalIndex = QMetaObjectPrivate::signalIndex(metaMethod);
QQmlBoundSignalExpression *expression = ctxtdata ?
new QQmlBoundSignalExpression(target, signalIndex,
ctxtdata, this, m_cdata->compilationUnit->runtimeFunctions[binding->value.compiledScriptIndex]) : 0;
if (expression)
expression->setNotifyOnValueChanged(false);
m_signalExpression = expression;
}
示例11: QObject
StyleSet::StyleSet(QObject* pParent)
: QObject(pParent)
, mpStyleSetProps(StyleSetProps::nullStyleSetProps())
{
auto* pEngine = StyleEngineHost::globalStyleEngine();
QObject* p = parent();
if (p) {
QQuickItem* pItem = qobject_cast<QQuickItem*>(p);
if (pItem != nullptr) {
connect(pItem, &QQuickItem::parentChanged, this, &StyleSet::onParentChanged);
} else if (p->parent() != nullptr) {
styleSheetsLogInfo() << "Parent to StyleSet is not a QQuickItem but '"
<< p->metaObject()->className() << "'. "
<< "Hierarchy changes for this component won't be detected.";
if (pEngine) {
Q_EMIT pEngine->exception(
QString::fromLatin1("noParentChangeReports"),
QString::fromLatin1("Hierarchy changes for this component won't be detected"));
}
}
mPath = traversePathUp(p);
if (!pEngine) {
connect(StyleEngineHost::globalStyleEngineHost(),
&StyleEngineHost::styleEngineLoaded, this, &StyleSet::onStyleEngineLoaded);
}
setupStyle();
}
}
示例12: lqtL_connect
static int lqtL_connect(lua_State *L) {
static int methodId = 0;
QObject* sender = static_cast<QObject*>(lqtL_toudata(L, 1, "QObject*"));
if (sender == NULL)
return luaL_argerror(L, 1, "sender not QObject*");
const char *signal = luaL_checkstring(L, 2);
const QMetaObject *senderMeta = sender->metaObject();
int idxS = senderMeta->indexOfSignal(signal + 1);
if (idxS == -1)
return luaL_argerror(L, 2, qPrintable(QString("no such sender signal: '%1'").arg(signal + 1)));
QObject* receiver;
QString methodName;
if (lua_type(L, 3) == LUA_TFUNCTION) {
receiver = sender;
// simulate sender:__addmethod('LQT_SLOT_X(signature)', function()...end)
QMetaMethod m = senderMeta->method(idxS);
methodName = QString(m.signature()).replace(QRegExp("^[^\\(]+"), QString("LQT_SLOT_%1").arg(methodId++));
lua_getfield(L, 1, "__addmethod");
lua_pushvalue(L, 1);
lua_pushstring(L, qPrintable(methodName));
lua_pushvalue(L, 3);
lua_call(L, 3, 0);
methodName.prepend("1");
} else {
receiver = static_cast<QObject*>(lqtL_toudata(L, 3, "QObject*"));
if (receiver == NULL)
return luaL_argerror(L, 3, "receiver not QObject*");
const char *method = luaL_checkstring(L, 4);
methodName = method;
const QMetaObject *receiverMeta = receiver->metaObject();
int idxR = receiverMeta->indexOfMethod(method + 1);
if (idxR == -1)
return luaL_argerror(L, 4, qPrintable(QString("no such receiver method: '%1'").arg(method + 1)));
}
bool ok = QObject::connect(sender, signal, receiver, qPrintable(methodName));
lua_pushboolean(L, ok);
return 1;
}
示例13: stringValue
JSValue QtInstance::stringValue(ExecState* exec) const
{
QObject* obj = getObject();
if (!obj)
return jsNull();
// Hmm.. see if there is a toString defined
QByteArray buf;
bool useDefault = true;
getClass();
if (m_class) {
// Cheat and don't use the full name resolution
int index = obj->metaObject()->indexOfMethod("toString()");
if (index >= 0) {
QMetaMethod m = obj->metaObject()->method(index);
// Check to see how much we can call it
if (m.access() != QMetaMethod::Private
&& m.methodType() != QMetaMethod::Signal
&& m.parameterTypes().isEmpty()) {
const char* retsig = m.typeName();
if (retsig && *retsig) {
QVariant ret(QMetaType::type(retsig), (void*)0);
void * qargs[1];
qargs[0] = ret.data();
if (QMetaObject::metacall(obj, QMetaObject::InvokeMetaMethod, index, qargs) < 0) {
if (ret.isValid() && ret.canConvert(QVariant::String)) {
buf = ret.toString().toLatin1().constData(); // ### Latin 1? Ascii?
useDefault = false;
}
}
}
}
}
}
if (useDefault) {
const QMetaObject* meta = obj ? obj->metaObject() : &QObject::staticMetaObject;
QString name = obj ? obj->objectName() : QString::fromUtf8("unnamed");
QString str = QString::fromUtf8("%0(name = \"%1\")")
.arg(QLatin1String(meta->className())).arg(name);
buf = str.toLatin1();
}
return jsString(exec, buf.constData());
}
示例14: instantiateQObjectFromStringTest
void mafObjectFactoryTest::instantiateQObjectFromStringTest() {
mafRegisterQtObject(QObject);
QObject *obj = mafNEWQtFromString("QObject");
QVERIFY(obj != NULL);
QString cn = obj->metaObject()->className();
QVERIFY(cn == "QObject");
delete obj;
}
示例15: connect
// Connect up a particular slot name, with optional arguments.
static void connect(QObject *qobj, PyObject *slot_obj,
const QByteArray &slot_nm, const QByteArray &args)
{
// Ignore if it's not an autoconnect slot.
if (!slot_nm.startsWith("on_"))
return;
// Extract the names of the emitting object and the signal.
int i;
i = slot_nm.lastIndexOf('_');
if (i - 3 < 1 || i + 1 >= slot_nm.size())
return;
QByteArray ename = slot_nm.mid(3, i - 3);
QByteArray sname = slot_nm.mid(i + 1);
// Find the emitting object and get its meta-object.
QObject *eobj = qobj->findChild<QObject *>(ename);
if (!eobj)
return;
const QMetaObject *mo = eobj->metaObject();
// Got through the methods looking for a matching signal.
for (int m = 0; m < mo->methodCount(); ++m)
{
QMetaMethod mm = mo->method(m);
if (mm.methodType() != QMetaMethod::Signal)
continue;
QByteArray sig(mm.methodSignature());
if (Chimera::Signature::name(sig) != sname)
continue;
// If we have slot arguments then they must match as well.
if (!args.isEmpty() && Chimera::Signature::arguments(sig) != args)
continue;
QObject *receiver;
QByteArray slot_sig;
if (pyqt5_get_connection_parts(slot_obj, eobj, sig.constData(), false, &receiver, slot_sig) != sipErrorNone)
continue;
// Add the type character.
sig.prepend('2');
// Connect the signal.
QObject::connect(eobj, sig.constData(), receiver, slot_sig.constData());
}
}