Datakent Ana Sayfa
Anasayfa Anasayfa > Diğer bölümler > C# & ASP.NET
  Aktif Konular Aktif Konular RSS: QT programlamanın güzelliği ve anlamsız mimari
  Yardım Yardım  Hızlı Ara   Kayıt Ol Kayıt Ol  Giriş Giriş

QT programlamanın güzelliği ve anlamsız mimari

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
aziz.alkurt Açılır Menü Göster
Admin Group
Admin Group
Simge

Kayıt Tarihi: 27.Ocak.2012
Bulundugu Yer: TRABZON
Online: Sitede Değil
Gönderilenler: 26
  Alıntı aziz.alkurt Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: QT programlamanın güzelliği ve anlamsız mimari
    Gönderim Zamanı: 06.Ekim.2012 Saat 12:28
Öncelikle ne anlatmak istediğimi örnek bir api yazarak ifade edersem daha anlamlı olacağını düşünüyorum.
Amacım bir html stringini QT ile yazdığım apiden pdf convert istemem. Bunun için QT içerisindeki QWebFrame nesnesinin içerisine html stringi aktaracağım. Daha sonra QT nin sahip olduğu sanal printer ile bunu istediğim dosyaya yazdıracağım.
QT Tarafı
/**********************************************************************/
#include <QApplication>
#include <QPrinter>
#include <QWebFrame>
#include <QWebPage>
extern "C" __declspec(dllexport) void __stdcall convertPDF(const char * data,const char * outputFileAddress)
{
    QString str= QString::fromUtf8(data);
    QString fileAddress= QString::fromUtf8(outputFileAddress);
    /*Statik qt programını başlat*/
    int arc=0;
    char * arg[] = {"pdfWriter",0};
    QApplication *app=new QApplication( arc, arg );
    /*****************************/
    QWebPage header;
    QWebFrame *mainFrame=header.mainFrame();
    /*Özellik katma örneği QWebFrame*/
    header.settings()->globalSettings()->setAttribute(QWebSettings::JavascriptEnabled,true);
    /*********************/
    mainFrame->setHtml(str);
    QPrinter *printer=new QPrinter(QPrinter::ScreenResolution);
    printer->setOutputFormat(QPrinter::PdfFormat);
    printer->setPageSize(printer->A4);
    /*Özellik katma örneği Printer*/
    printer->setResolution(100);
    printer->setOutputFileName(fileAddress);
    /*****************************/
    mainFrame->print(printer);
    app->exit();
}
/******************************************************************/
C# Tarafı
/*****************************************************************/
        static void Main(string[] args)
        {
            convertPDF("<html><div align=\"center\">Hello World<div></html>","d:/test1.pdf");
        }
        [DllImport("pdfConverter.dll", EntryPoint = "convertPDF", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        static extern void convertPDF(string data, string outFileAddress);
/*****************************************************************/
Bu kod denemesini yazmadan önce 4.7.1 source kodunu indirip, Visual studio 2010 C++ üzerinde QT'yi derledim. Başta QtCore projesi olmak üzere diğer bağlı projeleri inceledim. Anladığım kadarıya QT tam olarak bir c++ kütüphanesi. Birde farklı olarak extend yapısı var. O da şu: Header dosyasına exdend yapacağın objeyi Q_OBJECT yapıyorsun. QDevelop editorü de "moc.exe" ye o yazdığın headeri gönderiyor. O da belli mantık içerisinde ".cpp" dosyasını oluşturuyor ve editöre gönderiyor. O da c++ derleyicisi olarak gönderilen ".cpp" dosyasını derliyor. Normal bir c++ derleyicisiyle qt projesi derlenebilir.  Zaten C++ kütüphanesi olarak piyasaya sürülseydi bunlara gerek kalmazdı.

Örnek kod için gözlemlerimi anlatayım:
Buradan gözlemleyeceğimiz gibi QT'nin sanal printer mantığı çok işe yarayacak gibi gözüküyor.
Fakat Keşke QPrinter neslesinin dosyaya değilde bir stream'a veya byte array çıktısı verme özelliği olsa diyoruz. Açık kaynak olması bu nesleye bu özelliği koymamızı sağlar, ama qt geliştiren firmanın bunu düşünemesi beni düşündürür. Veya öyle bir özelliği var fakat ben gözden kaçırdım veya bulamadım. Google amca'da bana yardım edemedi. Sadece örnek projelerde tempfile oluştrup, ordan okuduktan sonra QByteArray'e çevirip sildirme gibi örnek gösterdi. Zaten önemsiz bir istek benimkisi. Kaynak kodları bendeyse oraya kolaylıkla müdale edebilirim.

Önemli husus yazılım anlayışına ters düşen büyük bir problem var. QApplication oluşturmadan bu kodu çalıştıramıyorsunuz.  Oluşturduğunuz QApplication nereye bağlı o da belirsiz. Anlayamadığım nokta ise bu denli statik mantık ile yazılmış bir kavram nasıl oluyorda dll yapabildiğini ifade edebiliyor veya oluşturma izni veriyor. Düşünsenize bir işletim sisteminin bu mantıkla apileri kullandığını. İki kere notepad çalıştırdığınızda mavi ekran ile karşılaşmak. Bu duruma örnek vermem gerekirse, bu yazdığım api deki fonksiyonu, diğer bir proglamla dilinde (ben c# kullandım) iki veya daha fazla thread oluşturup bu fonkisyonu aynı anda veya sıralı bir şekilde çağırdığımız zaman api'nin çakacağını göreceksiniz.

Kişisel düşüncelerim: QT mimarisi dinamik anlayışa ters kurulmuş. Microsoft'un QT' yi adam akıllı mantığa oturması, veya QT kavramını kaldırıp, kütüphanelerini kendi c++ referansına katması ümidiyle.

Aziz ALKURT
Bilgisayar Mühendisi


Düzenleyen aziz.alkurt - 06.Ekim.2012 Saat 12:31
Yukarı Dön
murat turan Açılır Menü Göster
Admin Group
Admin Group
Simge
Datakent

Kayıt Tarihi: 01.Ekim.2003
Bulundugu Yer: Turkey
Online: Sitede Değil
Gönderilenler: 1767
  Alıntı murat turan Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 07.Ekim.2012 Saat 18:15
Dostum paylaşım içi teşekkürler. Bu durumda QPrinter C++'a entegre bir kütüphane haline dönüştürülemez mi?
Yukarı Dön
aziz.alkurt Açılır Menü Göster
Admin Group
Admin Group
Simge

Kayıt Tarihi: 27.Ocak.2012
Bulundugu Yer: TRABZON
Online: Sitede Değil
Gönderilenler: 26
  Alıntı aziz.alkurt Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 09.Ekim.2012 Saat 07:57
Abi QPrinter yapısı alırsak sadece diğer QWebview  gibi printer desteği olan nesneleri de almak zorunda kalırız. QCore projesi içerisinde QCoreApplication problemini düzeltirsek gerek kalmaz.

Düzenleyen aziz.alkurt - 09.Ekim.2012 Saat 08:05
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Menü Göster



Bu Sayfa 0,141 Saniyede Yüklendi. [power by : WebWiz]