Perşembe, 27 Mart 2014 15:42

Qt ile QCoreApplication sınıfının doğru kullanımı

Yazan 
Öğeyi Oyla
(0 oy)
Bir konsol uygulaması yazarken yada bir grafiksel arabirimi kullanmayan network, servis, komut uygulaması gibi bir program yazarken QCoreApplication sınıfını kullanmalıyız. QCoreApplication sınıfını kullanarak yazdığımız bir programın normal bir konsol uygulamasından en büyük farkı bir mesaj kuyruğuna sahip olmasıdır.
Ş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.

Okunma 4166 defa Son Düzenlenme Perşembe, 27 Mart 2014 16:24
Ufuk Yıldırım

Yazılım Geliştirme Uzmanı

Web site: www.ufuk.biz

Yorum Ekle

Gerekli olan (*) işaretli alanlara gerekli bilgileri girdiğinizden emin olun. HTML kod izni yoktur.