PDA

View Full Version : مبتدی: نوشتن متدی برای enterEvent برای یک button



ehsan_faal
دوشنبه 15 تیر 1394, 22:41 عصر
سلام.من میخوام برای دکمه هایی که روی فرمم گذاشتم متدهایی بنویسم که وقتی موس میره روشون یا از روی دکمه ها میاد کنار اونا اجرا بشن.
میتونم یه کلاس جدید از QPushButton مشتق کنم و دوتا متد enter Event و leaveEvent رو بر اساس چیزی که میخوام توشون بنویسم و نهایتا توی MainWindow دو تا دکمه از اونها بسازم.
حالا سوالم اینجاست که اگه کارایی که توی اون متدها میخوام انجام بدم مربوط به کلاس دکمه نباشه چی؟
مثلا بخوام وقتی موس رفت روی یکی از این دکمه ها یه لیبل متنش عوض بشه.
باید چیکار کنم؟
راه بهتر واسه درست کردن سیگنال hover چیه؟

با تشکر

chikar
سه شنبه 16 تیر 1394, 00:23 صبح
می تونید با استفاده از متد eventFilter از کلاس QObject این کار رو انجام بدید
از طریق این متد و با استفاده از کلاس QEvent و enum هاش تقریبا تمامی متد های مجازی که برای ویجت ها تعبیه شده، قابل استفاده است ، بدون اینکه نیاز داشته باشد مثل روشی که اشاره کردید ساب کلاس بسازید :

qApp->installEventFilter(this);
//ui->pushButton->installEventFilter(this);

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::HoverEnter & obj == ui->pushButton)
{
ui->label->setText("Change Label");
return true;
}
return QMainWindow::eventFilter(obj,event);
}

chikar
سه شنبه 16 تیر 1394, 00:37 صبح
یه راه دیگه هم همون روش خودتون هست، مثلا اگر می خواید که با رفتن موس متن label تون تغییر کنه، باید یک Label درون سازنده ساب کلاستون (مثلا ساب کلاستون از جنس دکمه است) و درون متد EnterEvent متن رو تغییر بدید مثل

#include "mybtn.h"
#include <QLabel>

mybtn::mybtn(QWidget *parent) :
QPushButton(parent)
{
lbl = new QLabel("salam",parent);
lbl->setGeometry(10,10,150,150);
}

void mybtn::enterEvent(QEvent *)
{
lbl->setText("Change My Label");
}

ehsan_faal
سه شنبه 16 تیر 1394, 01:11 صبح
ممنون روش اولتون به نظرم بهتره چون توی کلاس اصلی تعریف میشه و نیازی به ایجاد کلاس جدید نیست.