PDA

View Full Version : سوال: معادل رویدادهای MouseEnter و MouseLeave در کیوت



sd.CSharpProgrammer
سه شنبه 13 دی 1390, 18:51 عصر
سلام

تو wpf رویدادهای MouseEnter و MouseLeave برای اداره ورود و خروج ماوس به ناحیه یک کامپیوننت وجود دارند. معادل اینها در کیوت چیه؟! من چندتا لیبل دارم که میخوام برای رفت و برگشت ماوس رو اونها کد بخصوصی رو اجرا کنم.

تو اینترنت زیاد گشتم ولی جز چندجا که از EventFilter استفاده کرده بودند چیز دیگه ای پیدا نشد که البته اونم نفهمیدم چیه چون انگلیسیم خوب نیست.

دوستان ممنون میشم راهنمائی کنید.

حامد مصافی
سه شنبه 13 دی 1390, 21:10 عصر
در کیوت توابع مربوط به ماوس به صورت تابع virtual protected تعریف شده‌اند. شما می‌توانید در کلاس خودتان آنها را بازنویسی کنید و بدین ترتیب از این رویداد‌ها آگاه خواهید شد. برای اطلاعات بیشتر این لینک‌ها را ببینید:
http://developer.qt.nokia.com/doc/qt-4.8/qwidget.html#enterEvent
http://developer.qt.nokia.com/doc/qt-4.8/qwidget.html#leaveEvent

sd.CSharpProgrammer
سه شنبه 13 دی 1390, 22:12 عصر
در کیوت توابع مربوط به ماوس به صورت تابع virtual protected تعریف شده‌اند. شما می‌توانید در کلاس خودتان آنها را بازنویسی کنید و بدین ترتیب از این رویداد‌ها آگاه خواهید شد. برای اطلاعات بیشتر این لینک‌ها را ببینید:
http://developer.qt.nokia.com/doc/qt-4.8/qwidget.html#enterEvent
http://developer.qt.nokia.com/doc/qt-4.8/qwidget.html#leaveEvent
ممنون دوست عزیز کمک بزرگی کردید.

یک سوال دیگه!
اینجا سورس کلاسی رو میگذارم که برای اضافه کردن خاصیت opacity به لیبلها نوشتم. مشکل اینجاست که وقتی این رویدادها رو در این کلاس پیاده سازی میکنم و چندتا از این ویجت رو کنار هم میگذارم وقتی ماوس به سرعت از روی لیبل ها حرکت میکنه عملیات opacity قطع و وصل میشن!! فکر میکند کجای کار ایراد داره؟!


masterlabel.h :

#ifndef MASTERLABEL_H #define MASTERLABEL_H #include <QLabel> #include <QEvent> #include <QPropertyAnimation> #include <QGraphicsOpacityEffect> class MasterLabel : public QLabel { Q_OBJECT public: MasterLabel(QWidget *parent = 0); qreal Opacity() const; void setOpacity(qreal value); void startFadeAnimation(QVariant startValue, QVariant endValue, int duration = 500); void startFadeInAnimation(int duration = 500); void startFadeOutAnimation(int duration = 500); private: qreal opacity; QPropertyAnimation *animation; QGraphicsOpacityEffect *opacityEffect; void setWidgetOpacity(); protected: void enterEvent(QEvent *); void leaveEvent(QEvent *); }; #endif // MASTERLABEL_H

masterlabel.cpp :

#include "masterlabel.h" MasterLabel::MasterLabel(QWidget *parent) : QLabel(parent) { opacity = 0.5; opacityEffect = new QGraphicsOpacityEffect; opacityEffect->setOpacity(opacity); animation = new QPropertyAnimation(opacityEffect, "opacity"); setMouseTracking(true); setGraphicsEffect(opacityEffect); } void MasterLabel::enterEvent(QEvent *) { startFadeInAnimation(300); } void MasterLabel::leaveEvent(QEvent *) { startFadeOutAnimation(300); } qreal MasterLabel::Opacity() const { return opacity; } void MasterLabel::setOpacity(qreal value) { opacity = value; setWidgetOpacity(); } void MasterLabel::setWidgetOpacity() { opacityEffect->setOpacity(opacity); } void MasterLabel::startFadeAnimation(QVariant startValue, QVariant endValue, int duration) { animation->setDuration(duration); animation->setStartValue(startValue); animation->setEndValue(endValue); animation->start(); } void MasterLabel::startFadeInAnimation(int duration) { animation->setDuration(duration); animation->setStartValue(opacity); animation->setEndValue(1); animation->start(); } void MasterLabel::startFadeOutAnimation(int duration) { animation->setDuration(duration); animation->setStartValue(1); animation->setEndValue(opacity); animation->start(); }

حامد مصافی
سه شنبه 13 دی 1390, 22:51 عصر
خطوط زیر رو در ابتدای توابع startFadeInAnimation و startFadeOutAnimation قید کنید

if(animation->state() == QAbstractAnimation::Running)
animation->stop();

sd.CSharpProgrammer
چهارشنبه 14 دی 1390, 00:42 صبح
واقعاً ممنونم استاد درست شد. میشه توضیح بدین علت مشکل چی بود؟ در ظاهر امر وقتی بهش فکر میکنم تو منطق خودم مشکلی پیش نمیاد ولی در عمل نتیجه چیز دیگه ای میشد!!
دلیل این قطع و وصل شدن انیمیشن چی بود؟!

مرسی

حامد مصافی
چهارشنبه 14 دی 1390, 09:33 صبح
جواب ساده است. اگر بدون متوقف کردن انیمیشن آنرا شروع کنید دو روند جدید در پیش گرفته می‌شود که موجب تداخل می‌شود

sd.CSharpProgrammer
چهارشنبه 14 دی 1390, 11:58 صبح
از راهنمائی های بسیار مفیدتون ممنونم دوست عزیز :لبخندساده: