QT programlamanın güzelliği ve anlamsız mimari |
Yanıt Yaz |
Yazar | |
aziz.alkurt
Admin Group Kayıt Tarihi: 27.Ocak.2012 Bulundugu Yer: FETHİYE Online: Sitede Değil Gönderilenler: 26 |
Alıntı Cevapla
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 |
|
murat turan
Üye Profili
Özel Mesaj Yolla
Bu kullanıcıya ait mesajları bul
Üyenin Web Sitesie Git
Arkadaş Listeme Ekle
Admin Group Datakent Kayıt Tarihi: 01.Ekim.2003 Bulundugu Yer: Turkey Online: Sitede Değil Gönderilenler: 1798 |
Alıntı Cevapla 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?
|
|
aziz.alkurt
Admin Group Kayıt Tarihi: 27.Ocak.2012 Bulundugu Yer: FETHİYE Online: Sitede Değil Gönderilenler: 26 |
Alıntı Cevapla 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 |
|
Yanıt Yaz |
Forum Atla | Forum İzinleri Kapalı Foruma Yeni Konu Gönderme Kapalı Forumdaki Konulara Cevap Yazma Kapalı Forumda Cevapları Silme Kapalı Forumdaki Cevapları Düzenleme Kapalı Forumda Anket Açma Kapalı Forumda Anketlerde Oy Kullanma |