Qt kullanmaya yeni başladım ve tüm örnek sınıf tanımlarının Q_OBJECT
ilk satır olarak makroya sahip olduğunu fark ettim . Bu önişlemci makrosunun amacı nedir?
Qt kullanmaya yeni başladım ve tüm örnek sınıf tanımlarının Q_OBJECT
ilk satır olarak makroya sahip olduğunu fark ettim . Bu önişlemci makrosunun amacı nedir?
Yanıtlar:
Gönderen Qt belgelerinde :
Meta-Object Compiler, moc, Qt'nin C ++ uzantılarını işleyen programdır.
Moc aracı bir C ++ başlık dosyasını okur. Q_OBJECT makrosunu içeren bir veya daha fazla sınıf bildirimi bulursa, bu sınıflar için meta nesne kodunu içeren bir C ++ kaynak dosyası üretir. Diğer şeylerin yanı sıra, sinyaller ve yuva mekanizması, çalışma zamanı türü bilgisi ve dinamik özellik sistemi için meta nesne kodu gereklidir.
Q_OBJECT::connect()
sadece açık bir şekilde yazmam gerekmiyor connect()
?
Basitçe ön derleyiciye bu sınıfın gui öğelerine sahip olduğunu ve 'moc' üzerinden çalıştırılması gerektiğini söyler, bunu yalnızca sinyal / yuva mekanizmasını kullanan sınıflara eklemeniz gerekir.
Ancak diğer sınıflarda sessizce göz ardı edilecektir - sadece yapım süresine katkıda bulunur.
Q_OBJECT
sonları qobject_cast
ve iç gözlem. Bazı kafa karıştırıcı davranışlara yol açabilir, bu yüzden kötü bir fikirdir.
Q_OBJECT
Diğer (olmayan QObject
) sınıflarda "sessizce" görmezden gelineceği doğru değil . C ++ standardına göre, hiçbir zaman tanımlanmayan birkaç üye işlevi ve değişkeni bildirerek tanımsız davranış sağlar. Ayrıca sınıfınızın ad alanını QObject
-özel üyelerle kirletir . Örneğin, Q_OBJECT
çağrılan bir yöntemi içeren ilgisiz bir sınıfı pekala bozabilir metaObject
.
Q_OBJECT
makro ile donatmak isteseniz de, makro ile gui olmayan sınıflara ve makro olmadan gui sınıflarına sahip olmak tamamen mantıklıdır. Makro kullanışlıdır, ancak gui sınıfları için ne sınırlı ne de zorunludur.
MOC (meta nesne derleyici), Q_OBJECT makro dahil başlık dosyalarını C ++ eşdeğer kaynak koduna dönüştürür. Temel olarak sinyal yuvası mekanizmasını kontrol eder ve C ++ derleyicisine anlaşılır hale getirir.
Q_OBJECT
Makro derleyici tarafından genişletilir, bunun için moc'a gerek yoktur. Moc, makronun kendisiyle hiçbir şey yapmaz, ancak makronun bildirdiği üye değişkenlerin ve yöntemlerin tanımlarını oluşturur . Q_OBJECT
1 Meta-Nesne Sisteminin Qt belgelerinden
Moc aracı bir C ++ kaynak dosyasını okur. Q_OBJECT makrosunu içeren bir veya daha fazla sınıf bildirimi bulursa, bu sınıfların her biri için meta nesne kodunu içeren başka bir C ++ kaynak dosyası üretir. Oluşturulan bu kaynak dosya ya sınıfın kaynak dosyasına # dahil edilir ya da daha genel olarak derlenir ve sınıfın uygulamasıyla ilişkilendirilir.
2 THE Q_OBJECT'in Qt belgelerinden
Q_OBJECT makrosu, kendi sinyallerini ve yuvalarını bildiren veya Qt'nin meta-nesne sistemi tarafından sağlanan diğer hizmetleri kullanan bir sınıf tanımının özel bölümünde görünmelidir.
3 moc'un Qt belgelerinden
Moc aracı bir C ++ başlık dosyasını okur. Q_OBJECT makrosunu içeren bir veya daha fazla sınıf bildirimi bulursa, bu sınıflar için meta nesne kodunu içeren bir C ++ kaynak dosyası üretir. Diğer şeylerin yanı sıra, sinyaller ve yuva mekanizması, çalışma zamanı türü bilgisi ve dinamik özellik sistemi için meta nesne kodu gereklidir.
4 Sinyallerin ve Yuvaların Qt belgelerinden
Q_OBJECT makrosu, önişlemci tarafından moc tarafından uygulanan birkaç üye işlevi bildirmek için genişletilir; "LcdNumber için vtable'a tanımsız başvuru" satırları boyunca derleyici hataları alırsanız, muhtemelen moc'u çalıştırmayı veya moc çıktısını link komutuna eklemeyi unutmuşsunuzdur.
Gcc'de -E
genişletilmiş makroları görebilirsiniz. Q_OBJECT
Linux'ta gcc'ye genişleyen şey budur . Bunun platforma bağlı olabileceğini ve QT sürümüne bağlı olarak değişebileceğini unutmayın. Bunun sadece moc derleyicisi için bir etiket olmadığını görebilirsiniz.
# 11 "mainwindow.hh"
#pragma GCC diagnostic push
# 11 "mainwindow.hh"
# 11 "mainwindow.hh"
#pragma GCC diagnostic ignored "-Wsuggest-override"
# 11 "mainwindow.hh"
static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, cons
t char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private:
# 11 "mainwindow.hh"
#pragma GCC diagnostic ignored "-Wattributes"
# 11 "mainwindow.hh"
__attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
# 11 "mainwindow.hh"
#pragma GCC diagnostic pop
# 11 "mainwindow.hh"
struct QPrivateSignal {};
Q_OBJECT makrosu, kendi sinyallerini ve yuvalarını bildiren veya Qt'nin meta-nesne sistemi tarafından sağlanan diğer hizmetleri kullanan bir sınıf tanımının özel bölümünde görünmelidir.
Q_OBJECT
Makro, türetilen her sınıfta görünmelidir QObject
. Makro yokken kodunuz ince bir şekilde kırılır ve sırf derlenmek onu tamamlamaz.
Q_OBJECT
makro eksik olduğunda derleyen ancak çalışmayan bir kod örneğiniz var mı?
Q_OBJECT
erişim belirticilerini kullandığını görürsünüz. Yani makro altında görünmesinin gerekip gerekmediğini private
, protected
veya public
belirteçleri önemsizdir - sınıfın başında yerleştirmek için sadece bir âdet.