تفاعل QTREAD مع واجهة المستخدم الرسومية
سؤال
أقوم بتطوير برنامج Aquistion. أرغب في تشغيل وظيفة العرض في مؤشر ترابط منفصل (لضمان عرض مباشر لسهولة التقاط الصور). في الوقت الحالي ، أقوم بتصنيف Qobject ، وإنشاء DisplayObject واستخدام وظيفة QTHread :: MovetOthRead. المشكلة هي أن DisplayObject يجب أن يتفاعل مع واجهة المستخدم الرسومية (يجب عرض الصور في كائنات QGraphicsView). ما هي أفضل طريقة (والأكثر أناقة) للقيام بذلك؟
الحل الحالي:
class DisplayObject : public QObject
{
Q_OBJECT
public:
inline void addDetectorSystem(cci::PGR* system);
inline void connectGui(ImageAquisition* gui);
public slots:
void display();
private:
cci::PGR* camSystem;
ImageAquisition* guiClass;
};
تتم تهيئة DisplayObject على النحو التالي:
DisplayObject Displayer;
Displayer.addDetectorSystem(PGRSystem);
Displayer.connectGui(this);
QThread thread;
Displayer.moveToThread(&thread);
connect(this, SIGNAL(display()), &Displayer, SLOT(display()));
thread.start();
لقد نسيت أن أعترف ، أنه لا يعمل ...
المحلول
يمكنك استخدام Qimage في المواضيع غير UI. هذا من شأنه أن يتيح لك القيام بالتقاط/رسم إلى صورة. بمجرد أن تكون الصورة جاهزة لعرضها ، يمكنك بعد ذلك إصدار إشارة مع الصورة. يجب أن يحتوي عنصر واجهة المستخدم على فتحة متصلة بتلك الإشارة التي تأخذ الصورة المحددة وتحديث نفسها لرسم تلك الصورة.
باستخدام الإشارات والفتحات ، يجب نقل البيانات بطريقة آمنة مؤشرات الترابط. باستخدام Qimages في مؤشرات الترابط الأخرى ، يمكنك الرسم ، والاجتماع الرئيسي هو المسؤول فقط عن تحديث الصور التي تم إنشاؤها ، بدلاً من قضاء الكثير من الوقت في معالجتها.
نصائح أخرى
بشكل عام ، فإن واجهة المستخدم الرسومية هي الخيط الرئيسي ويتم أي عمل في خيوط الخلفية.
وذلك لأن الخيط الرئيسي يحتاج إلى التعامل مع الأحداث الماوس ، إعادة الرسم ، أيقونة ، إلخ
الشيء الجميل في QT هو أنه يمكنك إرسال فتحات/إشارات بين المواضيع.
يرى الخيوط في كيو تي للحصول على نظرة عامة.
هناك أيضا جديد جيد كتاب QT المتقدم الذي يغطي threadign بالتفصيل