Şimdi ilk denememizi ve çok yapılan yanlışları görelim.
class CSomeClass { public: CSomeClass() {} ~CSomeClass() {} void Run() { cerr << "Merhaba Dünya!" << endl; } }; int main( int argc, char ** argv ) { QCoreApplication cApp( argc, argv ); CSomeClass cFoo; cFoo.Run(); return( 0 ); }
Burada QCoreApplication oluşturup doğru argümanları yapılandırıcısına gönderdik. Fakat mesaj kuyruğunun yada bir başka deyişle olay mekanizmasının çalışmasını sağlayan QCoreApplication::exec() metodunu çağırmadık. Program "Merhaba Dünya!" yazısını konsola yazacaktır fakat ileri seviye programlar için kullanacağımız mesaj kuyruğu ve olay mekanizması çalışmaz ve boş yere QCoreApplication sınıfını kullanmış oluruz.
Şimdi biraz düzeltme ile yeniden deneyelim.
class CSomeClass { public: CSomeClass() {} ~CSomeClass() {} void Run() { cerr << "Merhaba Dünya!" << endl; } }; int main( int argc, char ** argv ) { QCoreApplication cApp( argc, argv ); CSomeClass cFoo; cFoo.Run(); return( cApp.exec() ); }
Şimdi doğru şekilde olay mekanizmasını işlenmesini cApp.exec() komutu ile sağladık. Fakat yine bir problem var. Ekrana çıktı verdiğimiz CSomeClass::Run() metodu olay mekanizmasının dışında ekrana çıktı veriyor. Olay mekanizmasının doğru kullanmını göstermek için şimdide aşağıdaki örneğe bakalım.
// QObject den miras alarak QCoreApplication ile bağlantı yapmayı sağladık. class CSomeClass : public QObject { Q_OBJECT public: explicit CSomeClass(QObject *parent = 0) : QObject( parent ) {} public slots: void Run() { cerr << "Merhaba Dünya!" << endl; } }; int main( int argc, char ** argv ) { QApplication cApp( argc, argv ); CSomeClass cFoo; // Burada invokeMethod yardımı ile cFoo // nesnesinde bulunan "Run" metodunu uygulamamıza bağladık QMetaObject::invokeMethod( &cFoo, "Run", Qt::QueuedConnection ); return( cApp.exec() ); }
Şimdi programımız QCoreApplication'ı doğru kullanıyor. invokeMethod fonksiyonu cApp'ın için ne zaman mesaj döngüsü hazır hale gelirse o vakit Run metodunu çağırmasını istedik.