سؤال

ولدي QWidget الذي يعالج mouseevent، أي أنه يخزن mouseposition في قائمة عند الضغط على زر الماوس الأيسر. المشكلة هي، لا استطيع ان اقول القطعة لاتخاذ نقطة واحدة فقط كل س مللي ثانية.

وماذا سيكون بالطريقة المعتادة للحصول على هذه العينات؟

وتحرير: لأنه لا يسمى mouseevent في كثير من الأحيان، هل من الممكن أن تزيد من معدل

هل كانت مفيدة؟

المحلول

وهذا يبدو وكأنه كنت لا تريد التعامل مع الحدث غير متزامن في كل شيء، كنت ترغب فقط في الحصول على موقع المؤشر في فترات زمنية محددة.

وإعداد مؤقت لاطلاق النار كل س ميلي ثانية. توصيله إلى فتحة الذي يحصل على قيمة QCursor::pos(). استخدام QWidget::mapFromGlobal() إذا كنت في حاجة إلى موضع المؤشر في إحداثيات المحلي إلى عنصر واجهة المستخدم.

إذا كنت تريد فقط أن تفعل هذا في حين يقام على زر الماوس الأيسر باستمرار، واستخدام mousePressEvent() وmouseReleaseEvent() لبدء / إيقاف الموقت.

نصائح أخرى

لديك خيارين. هل يمكن إما وضع بعض المنطق في معالج الحدث الذي يخزن الطابع الزمني (في الألف) من الحدث الأخير. يمكنك ثم تأكد من أن الطابع الزمني مع كل حدث وفقط تخزين النقطة إذا اجتاز زمنية مناسبة.

و(هذه هي الطريقة البشعة) هل يمكن أن يكون دائما أيضا عملية في مكان ما في التطبيق الذي يسجل معالج الحدث كل س ميلي ثانية (إذا لم يتم تسجيل واحدة بالفعل) ومن ثم يكون معالج الحدث إلغاء تسجيل لهذا الحدث في معالج الخاص بك). وبهذه الطريقة، عندما يحدث هذا الحدث، معالج الحدث يحصل على إعادة سجلات الامم المتحدة والمسجلة وتوقيت لهذا الحدث في الفاصل الزمني الخاص بك محددة.

هل يمكن إضافة QTimer احد بالرصاص الذي موصول إلى فتحة أن يضع منطقية إلى true، وتعديل فتحة الحدث الماوس الخاص بك إلى الاختيار الأول للتأكد من منطقي هو الصحيح، وإذا تم تعيينها إلى false، لا الشفرة التي كانت ستعمل بشكل عادي، ثم في نهاية تعيين QTimer احد بالرصاص لتنفجر في مللي س.

وتصفية عليه. فقط تجاهل جميع مدخلات (لا وضعه في القائمة) إلا إذا مرت س مللي ثانية.

QTime m_time; // member of your class
int m_interval = 100; // ms

void MyWidget::StartCapturing()
{
    m_time.start();
}

void MyWidget::OnMouseEvent(...)
{
    if(m_time.elapsed() < m_interval)
        return;

    // process event

    m_time.reset();         
}

وتحرير: إذا قبل أي فرصة كنت تستخدم قائمة الانتظار اتصال OnMouseEvent (إذا كان في موضوع مختلف، من غير المحتمل في قضيتك)، استخدم فتحة وكيل ترتبط مباشرة لك إشارة مثيرة للاهتمام، وتصفية داخله وبعد ذلك فقط تنبعث منها إشارة قمت بالاتصال في قائمة الانتظار إلى. وإلا فإنك قد المزعج حلقة الحدث unnessesarily.

استخدم جهاز توقيت بدلا من الأحداث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top