eventFilter برای button در کیوت - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

eventFilter برای button در کیوت

+1 امتیاز

من یک کلاس برای فیلتر کردن event ها نوشتم به این شکل :

#include <QtWidgets/QApplication>
#include <QMouseEvent>
#include <QPushButton>
#include <QObject>
#include <QEvent>
#include <QDebug>
#include <QLineEdit>

class MyFilter :public QObject
{
public:
	bool eventFilter(QObject* obj, QEvent* e){
		if (e->type() == QEvent::MouseButtonPress)
		{
			if (... ? ? )//inja che konam
			{
				qDebug() << "Right clicking a button";
			}
		}
		return QObject::eventFilter(obj, e);
	}
};
int main(int argc, char *argv[])
{
	
	QApplication a(argc, argv);
	a.installEventFilter(new MyFilter());
	QPushButton button;
	button.show();
	return a.exec();
}

می خواستم بدونم الان چطور میشه فهمید آیا obj  از نوع QPushButton* هست و این که آیا کد کلید مربوط به راست کلیک هست یا خیر(داخل QEvent متدی به اسم button من ندیدم)

سوال شده شهریور 25, 1393  بوسیله ی sailent (امتیاز 355)   16 44 59
دوباره تگ گذاری شد شهریور 26, 1393 بوسیله ی sailent

2 پاسخ

+2 امتیاز
 
بهترین پاسخ
#include <QtWidgets/QApplication>
#include <QMouseEvent>
#include <QPushButton>
#include <QObject>
#include <QEvent>
#include <QDebug>
#include <QLineEdit>
 
class MyFilter :public QObject
{
public:
    bool eventFilter(QObject* obj, QEvent* e){
        if (obj->inherits("QPushButton") && e->type() == QEvent::MouseButtonPress){
			QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(e);
                qDebug() << "Right clicking a button";			
			
			/*of you need button object do this:
			QPushButton *button = qobject_cast<QPushButton*>(obj);			
			*/
        }
        return QObject::eventFilter(obj, e);
    }
};
int main(int argc, char *argv[])
{
     
    QApplication a(argc, argv);
    a.installEventFilter(new MyFilter());
    QPushButton button;
    button.show();
    return a.exec();
}

 

پاسخ داده شده مهر 2, 1393 بوسیله ی حامد مصافى (امتیاز 1,104)   2 3 12
انتخاب شد شهریور 21, 1394 بوسیله ی sailent
+2 امتیاز

برای تبدیل کلاس به کلاس child از dynammic cast استفاده کن اگر NULL نبود یعنی شی از نوع اون کلاس هست

یعنی باید این شکلی بنویسی :‌

#include <QtWidgets/QApplication>
#include <QMouseEvent>
#include <QPushButton>
#include <QObject>
#include <QEvent>
#include <QDebug>

class MyFilter :public QObject
{
public:
	bool eventFilter(QObject* obj, QEvent* e){
		if (e->type() == QEvent::MouseButtonPress)
		{
			QPushButton* button = dynamic_cast<QPushButton*>(obj);
			if (button != NULL)
			{
				QMouseEvent* mouseEvent = dynamic_cast<QMouseEvent*>(e);
				if (mouseEvent->button() == Qt::RightButton)
					qDebug() << "Right clicking a button";
			}
		}
		return QObject::eventFilter(obj, e);
	}
};
int main(int argc, char *argv[])
{

	QApplication a(argc, argv);
	a.installEventFilter(new MyFilter());
	QPushButton button;
	button.show();
	return a.exec();
}

 

پاسخ داده شده شهریور 25, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...