PDA

View Full Version : connect كردن



shaaadi
جمعه 14 خرداد 1389, 16:23 عصر
من يك كلاس دارم كه در اون فولدر ها و فايل ها رو با كيو تي نمايش مي دم و كلاس هايي هم براي خوندن از فايل (اين كه چه فايل و فولدر هايي رو نمايش بدم)
يك فايل root دارم كه همه ي فايل و فولدر هايي كه بايد نمايش بدم تو اونه ...
حالا براي اين كه وقتي روي يك فولدر كليك مي كنم توشو باز كنه كليك رو كانكت كردم با تابع showfolder ... من بايد يك جوري يك وكتور از *item كه محتويات اون فولدر هست رو به اون تابع showfolder بدم ... اما نمي دونم چه جوري !چه كار بايد بكنم ؟
(احتمالا خيلي بد توضيح دادم اگه لازم بود بگيد تا كدشو بذارم !)

baradar
جمعه 14 خرداد 1389, 17:39 عصر
با سلام
اگر نمونه کد بزارید و سوالتون رو خیلی ساده از روی کد بیان کنید
خیلی بهتر به پاسختون می رسید

shaaadi
جمعه 14 خرداد 1389, 18:08 عصر
#include "my.h"
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include "all.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
}
void MyWidget::showItem(){
setFixedSize(700, 500);
QPixmap pixmap("/home/elaheh/file_joda/1.bmp");
QVBoxLayout *layout = new QVBoxLayout;
int size = items.size();
count =1;
for (int i =0 ; i < size ; i++ )
{
if (items[i]->checkFormat()==2)
{
cout << "1" << items[i]->checkName() << endl;
QPushButton *tempP = new QPushButton(pixmap,"pic", this);
tempP->setFont(QFont("Times", 8, QFont::Bold));
cout << "address:" << items[i]->checkAddress() << endl;
connect(tempP, SIGNAL(clicked()),this, SLOT(text(items[i].checkAddress())));
layout->addWidget(tempP);
pic.push_back(tempP);
}
if (items[i]->checkFormat() == 1)
{
cout << "2" <<items[i]->checkName() << endl;
QPushButton *tempT = new QPushButton(pixmap,"txt", this);
tempT->setFont(QFont("Times", 8, QFont::Bold));
connect(tempT, SIGNAL(clicked()),this, SLOT(run(items[i].checkAddress())));
layout->addWidget(tempT);
pic.push_back(tempT);
}
if (items[i]->checkFormat() == 0)
{
cout << "3" << items[i]->checkName() << endl;
QPushButton *tempF = new QPushButton(pixmap,"folder", this);
tempF->setFont(QFont("Times", 8, QFont::Bold));
layout->addWidget(tempF);
fold.push_back(tempF);
cout << "salam" << endl;
connect(fold[i], SIGNAL(clicked()),this, SLOT(showFolder(fold[i])));
cout << "sare kar" <<endl;
count++;

}
setLayout(layout);
}
}
void MyWidget::run(string strE){
QString strQE;
strQE = QString::fromStdString(strE);
QPixmap pixmap(strQE);
l.setPixmap(pixmap);
l.show();
}
void MyWidget::text(string strE){
QString strQE;
strQE = QString::fromStdString(strE);
QFile file(strQE);
file.open(QFile::ReadWrite);
QTextStream st(&file);
QString str = st.readAll();
l.setText(str);
l.show();
}
void MyWidget::showFolder(item*){
MyWidget* newItem=new MyWidget;
cout << "chandomin:" << count << endl;
newItem->items =items[count-1]->checkItems();
cout << "chandomin:" << count-1 << endl;
newItem->showItem();
newItem->show();
}







در واقع مي خوام وقتي از connect استفاده مي كنم و ميره تو showFolder بدونه كه چه وكتوري از ايتم ها رو نمايش بده !

حامد مصافی
جمعه 14 خرداد 1389, 19:19 عصر
تابع sender ويدجت ارسال كننده سيگنال را مشخص خواهد كرد.


void MyWidget::showFolder(item*){
QPushButton *buttonSender = dynamic_cast<QPushButton *> ( sender() );

QMessageBox::information(
this,
"Sender",
"Sender is " + buttonSender->objectName() );

/*
MyWidget* newItem=new MyWidget;
cout << "chandomin:" << count << endl;
newItem->items =items[count-1]->checkItems();
cout << "chandomin:" << count-1 << endl;
newItem->showItem();
newItem->show();
*/
}

shaaadi
جمعه 14 خرداد 1389, 19:35 عصر
اخه مشکل اینه که با این مشکل داره :


connect(fold[i], SIGNAL(clicked()),this, SLOT(showFolder(fold[i])));



یعنی میگه show folder نباید ورودی داشته باشه !
حالا فرقی نمیکنه که ورودی چی بدم!

حامد مصافی
جمعه 14 خرداد 1389, 19:38 عصر
راست ميگه!
امضاي SIGNAL و SLOT بايد همسان باشند. همانطوري كه ميبينيد clicked پارامتر قبول نمي كند.

shaaadi
جمعه 14 خرداد 1389, 19:40 عصر
خب همین ! من چه کار کنم که بتونم بهش ورودی بدم ؟

حامد مصافی
جمعه 14 خرداد 1389, 19:56 عصر
ورودي نميشه!
بايد به نحو ديگري مشكل را حل كنيد.
اگر اصرار به استفاده از PushButton داريد يك كلاس كه از PushButton مشتق شود تعريف كنيد و يك خصوصيت دلخواه در آن قيد كنيد. سپس با استفاده از sender و cast آن مي توانيد به آن خصوصيت دسترسي پيدا كنيد.

shaaadi
شنبه 15 خرداد 1389, 04:35 صبح
خيلي خيلي ممنون ...
يك سوال ديگه راجع به connect :
چه طوري مي تونم right click رو به يك تابع مربوط كنم ؟
search كه كردم به يك تابع rightClick() رسيدم كه براي يك كلاسي هست كه من نميشناسم ... اگه بخوام با رايت كليك روي يك دكمه از جنس QPushButton يك تابع صدا زده بشه ... چه كار بايد بكنم ؟ يعني object اولي كه به connect ميدم از چه جنسي مي تونه باشه ؟ اخه QPushButton دادم ...گير داد ...

حامد مصافی
شنبه 15 خرداد 1389, 09:21 صبح
از سيگنال mousePressEvent استفاده كنيد و در تابع مربوطه خصوصيت Button شي QMouseEvent ارسالي را بررسي كنيد كه آيا برابر با Qt::RightButton است يا خير.