2016-03-27 14 views
0

Bu konuda internette çok fazla materyal kullanıyorum, ama ihtiyacım olanı bulamadım. Qt'de yeniden kullanılabilir bir boyama işlevi yapmak istiyorum. Örneğin, bir döngü içinde aramak ve x ve y koordinatlarının bir dikdörtgen çizer başlangıç ​​birQt - özel argümanlar ile yeniden kullanılabilir boya fonksiyonları

void paintRectangle(QPaintEvent*, int x, int y); 

işlevi yoktur. Mümkün mü? Taslağı nasıl yazmalıyım ve nasıl hazırlayacağımı nasıl anlatabilirim? Bu konuda hiçbir şey bulamadım. Ayrıca, bu işlevi nasıl arayabilirim? Arama yaparken QPaintEvent * yerine ne yazarım? Fark ettiğim gibi, herhangi bir sınıf kurucularından önce ağrı kesici maddeler denir. Bu doğru mu? Belirli bir sınıfın örneklendiği zaman bildirilen n değişkenine bağlı olarak ekranda belirli miktarda dikdörtgen olmasını isterim. Şu andaki denemelerimden itibaren, n numaramın bir şey çizmeye çalıştığı zaman tanımlanmamış gözüküyordu.

+0

* Arama yaparken QPaintEvent * 'yerine ne yazarım * => Muhtemelen bir [QPainter] ile çalışmak istiyorsunuz (http://doc.qt.io/qt-5/qpainter.html) . * "Fark ettiğim gibi, herhangi bir sınıf kurucusundan önce ağrı gidericiler aranıyor. Bu doğru mu?" * Hangi sınıf kurucuları? Bazı öğreticiler üzerinde çalışmalı ve sormadan önce bir kod parçası (ör. [MCVE] (http://stackoverflow.com/help/mcve)) hakkında somut bir soru sormalısınız. Buradaki öğreticiler: http://doc.qt.io/qt-5/examples-painting.html – HostileFork

cevap

1

Tek sınırlama, widget'ları boyadığınızda o widget'ın boya olayında olması gerektiğidir. Boya cihazınız bir widget değilse, o zaman fark etmez.

Bunun dışında, istediğiniz herhangi bir parametreyle istediğiniz sayıda resim işlevini herhangi bir sayıda çağırmanızı engelleyen hiçbir şey yoktur, yalnızca bir pencere öğesi durumunda, bu widget'ın boyasında çağrıldığından emin olun. Etkinlik. Örneğin: Ne fark ettik gibi

void paintEvent(QPaintEvent *) { 
    QPainter p(this); 
    // setup painter 
    for (int i = 0; i < 200; i += 10) drawFoo(i, p); 
} 

void drawFoo(int i, QPainter & p) { 
    p.drawPoint(i, i); 
} 

, paintevents herhangi sınıf yapıcıları önce denilen olsun. Bu doğru mu?

Bunu nereden duydunuz? Bir widget, oluşturulmadan önce boyanacağından şüphe duyuyorum;) Endişeniz, asılsız, inşa edilmeden önce herhangi bir widget boyandı, aslında, boyama yapmadan bir widget oluşturabilir - show()'u aramazsanız. Kurucu ve boya olayında bir hata ayıklama iletisi koyarsanız, yapıcının her zaman boya olayından önce yürütüldüğünü görürsünüz. Aslında, henüz tam olarak inşa edilmemiş bir nesnenin üye işlevini çağırmak tamamen “yasadışı” olacaktır.

+0

* Boya aygıtınız bir pencere öğesi değilse, fark etmez. Bunun dışında, istediğiniz herhangi bir parametreyle istediğiniz sayıda resim işlevini istediğiniz sayıda çağırmanızı engelleyen hiçbir şey yoktur * - Konuyla ilgili bazı kısıtlamalar vardır (http://stackoverflow.com/a/19801659/). 211160), yapamayacağınız şeyler zamanla yavaş yavaş azalır gibi görünüyor. – HostileFork

+0

@HostileFork - bu kısıtlama/sınırlama, QPainter ile değil, QPixmap ile ilgilidir. Multithreading'in soru bağlamında olduğunu sanmıyorum, ama kim bilir, biraz karanlıktır. – dtech

+0

İş parçacığı konuları, sunduğum bağlantıyı açıkladığından, tarihsel olarak daha geniştir. [QFontDatabase :: supportsThreadedFontRendering] (http://doc.qt.io/qt-4.8/qfontdatabase.html#supportsThreadedFontRendering) ve dökümandaki ifadeyi göz önünde bulundurun: * "false dönüş değeri, tüm QPainter :: drawText () GUI iş parçacığı dışındaki çağrılar okunabilir çıktı üretmeyecektir. "* Sizi burada ve orada oraya ısırmak için çok az bit var. – HostileFork

İlgili konular