ورود

View Full Version : سوال: دسترسی به ایونت کلیک یه ویجت که خودم درست کردم ... !



ravaei
چهارشنبه 06 اسفند 1393, 16:58 عصر
درود ...

یه Qpushbutton تو mainwindow.cpp ساختم با کد زیر :


QPushButton *btn;

board::board(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::board)
{
ui->setupUi(this);


btn = new QPushButton(this);
btn->setGeometry(170,170,60,60);
btn->setObjectName("btn1");
btn->setText("push...");

}





حالا مثلا 10 تا از این button ها که همشون رو با آبجکت btn گذاشتم رو فرم دارم . تو سی شارپ میتونسیم با دستور sender رو اون button که کلیک شده دسترسی پیدا کنیم و یه تابع btn تعریف کنیم که یه سری دستورات رو انجام بده ...

تو Qt چطور میتونم این کارو انجام بدم؟؟

chikar
چهارشنبه 06 اسفند 1393, 18:06 عصر
اگر منظورتون رو درست متوجه شده باشم ، می تونید تابع مجازی eventFilter رو دوباره تعریف کنید و در صورت کلیک روی آیتم مورد نظرتون دستوراتی رو انجام بدید مثلا

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress && object->objectName() == "btn1")
{
//your statement
}
return false;
}

chikar
چهارشنبه 06 اسفند 1393, 18:26 عصر
البته شما یه راه دیگه هم داری، اون استفاده از sender هست:
in MainWindow.cpp


x = 0; //x is int
for(int i=0;i<4 ;i++)
{
btn = new QPushButton(this);
btn->setGeometry(x,0,100,30);
btn->setProperty("my_btn",i);
btn->setText("push...");
x +=100;
connect(btn,SIGNAL(clicked()),this,SLOT(mybtn_clic ked()));
}

your slot

void MainWindow::mybtn_clicked()
{
msg.information(this,"",sender()->property("my_btn").toString());

}

128870

ravaei
چهارشنبه 06 اسفند 1393, 18:38 عصر
البته شما یه راه دیگه هم داری، اون استفاده از sender هست:
in MainWindow.cpp


x = 0; //x is int
for(int i=0;i<4 ;i++)
{
btn = new QPushButton(this);
btn->setGeometry(x,0,100,30);
btn->setProperty("my_btn",i);
btn->setText("push...");
x +=100;
connect(btn,SIGNAL(clicked()),this,SLOT(mybtn_clic ked()));
}

your slot

void MainWindow::mybtn_clicked()
{
msg.information(this,"",sender()->property("my_btn").toString());

}

128870



دقیقا دستور sender رو می خواستم خیلی ممنون :قلب::قلب::قلب::قلب::قلب::قلب:: لب::قلب::قلب::قلب::قلب::قلب::ق ب::قلب:

chikar
چهارشنبه 06 اسفند 1393, 18:46 عصر
دقیقا دستور sender رو می خواستم خیلی ممنون :قلب::قلب::قلب::قلب::قلب::قلب:: لب::قلب::قلب::قلب::قلب::قلب::ق ب::قلب:
خواهش می کنم

ravaei
جمعه 08 اسفند 1393, 18:17 عصر
...

درود ...

یه مشکل من یه تابع ساختم به نام createbtn که btn هارو اونجا به فرم add میکنه دستور connect رو هم که اونجا مینویسم error میده داخل main هم مینویسم کار نمی کنه واسه استفاده از connect باید همه کارو تو mainwindow آنجام بدم؟؟

chikar
جمعه 08 اسفند 1393, 20:01 عصر
یه مشکل من یه تابع ساختم به نام createbtn که btn هارو اونجا به فرم add میکنه دستور connect رو هم که اونجا مینویسم error میده داخل main هم مینویسم کار نمی کنه واسه استفاده از connect باید همه کارو تو mainwindow آنجام بدم؟؟[/QUOTE]

نه connect رو داخل تابع تون هم می تونید استفاده کنید
شما تابع createbtn رو داخل همون mainwindow تعریف کردید؟
می شه Connect ای که نوشتید رو بگذارید؟

chikar
جمعه 08 اسفند 1393, 20:02 عصر
درود ...

یه مشکل من یه تابع ساختم به نام createbtn که btn هارو اونجا به فرم add میکنه دستور connect رو هم که اونجا مینویسم error میده داخل main هم مینویسم کار نمی کنه واسه استفاده از connect باید همه کارو تو mainwindow آنجام بدم؟؟

نه connect رو داخل تابع تون هم می تونید استفاده کنید
شما تابع createbtn رو داخل همون mainwindow تعریف کردید؟
می شه Connect ای که نوشتید رو بگذارید؟

ravaei
جمعه 08 اسفند 1393, 20:22 عصر
نه connect رو داخل تابع تون هم می تونید استفاده کنید
شما تابع createbtn رو داخل همون mainwindow تعریف کردید؟
می شه Connect ای که نوشتید رو بگذارید؟




void createboard(QMainWindow *a , int n)
{

for(int i= 0 ; i<n ; i++)
{
xloc = 0;
yloc +=40;
for(int j =0 ; j<n ;j++)
{
xloc+=40;


btn = new QPushButton(a);
btn->setStyleSheet("background-color: rgb(85, 85, 0)");
btn->setGeometry(xloc,yloc,40,40);
btn->setObjectName("btn");
connect(btn,SIGNAL(clicked()),a,SLOT(mybtn_clicked ()));
}


}

}










board::board(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::board)
{


ui->setupUi(this);






createboard(this,5);










}



تابع create رو بیرون تعریف کردم زیر header ها ...
error نمیده ولی عملم نمیکنه :(

chikar
جمعه 08 اسفند 1393, 20:52 عصر
شما اولا بهتر هست که این تابع رو داخل خود MainWindow بنویسید خیلی عاقلانه تر هست
البته این روش هم جواب می ده، باید به این صورت عمل کنید



void my_funck(MainWindow *a)
{

QPushButton *btn0 = new QPushButton("ddddd",a);
btn0->setGeometry(10,10,100,30);
QObject::connect(btn0,SIGNAL(clicked()),a,SLOT(clo se()));
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{

ui->setupUi(this);
my_funck(this);
}

ravaei
جمعه 08 اسفند 1393, 21:07 عصر
شما اولا بهتر هست که این تابع رو داخل خود MainWindow بنویسید خیلی عاقلانه تر هست
البته این روش هم جواب می ده، باید به این صورت عمل کنید



void my_funck(MainWindow *a)
{

QPushButton *btn0 = new QPushButton("ddddd",a);
btn0->setGeometry(10,10,100,30);
QObject::connect(btn0,SIGNAL(clicked()),a,SLOT(clo se()));
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{

ui->setupUi(this);
my_funck(this);
}





تشکرات فراوان ... :قلب::قلب:

فقط نفهمیدم این یعنی چی؟؟

Qobject :: اصلا :: معنیش چیه؟؟ یخورده گنگه این چیزای c++ برام c# این دنگو فنگارو نداشت :متفکر:

chikar
جمعه 08 اسفند 1393, 21:28 عصر
تشکرات فراوان ... :قلب::قلب:

فقط نفهمیدم این یعنی چی؟؟

Qobject :: اصلا :: معنیش چیه؟؟ یخورده گنگه این چیزای C++‎ برام C#‎ این دنگو فنگارو نداشت :متفکر:

خواهش می کنم
برای اطلاعات بیشتر از QObject به مستندات کیوت مراجعه کنید
Connect هم یک تابع استاتیک از همین نوع هست