Sayfayı Yazdır | Pencereyi Kapat

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

Nereden Yazdırıldığı: Datakent
Kategori: Diğer bölümler
Forum Adı: C# & ASP.NET
Forum Tanımlaması: C# ve ASP.NET ile ilgili soru / sorun ve paylaşım bölümü
URL: http://forum.datakent.com/forum_posts.asp?TID=2432
Tarih: 20.Nisan.2024 Saat 09:02


Konu: QT programlamanın güzelliği ve anlamsız mimari
Mesajı Yazan: aziz.alkurt
Konu: QT programlamanın güzelliği ve anlamsız mimari
Mesaj Tarihi: 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



Cevaplar:
Mesajı Yazan: murat turan
Mesaj Tarihi: 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?

-------------
http://www.kasatakip.com - Kasa Takip  |  http://www.caritakip.com - Cari Takip  |  http://www.evraktakip.com - Evrak Takip  |  http://www.etasqlmobil.com - ETA SQL Mobil


Mesajı Yazan: aziz.alkurt
Mesaj Tarihi: 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.



Sayfayı Yazdır | Pencereyi Kapat