ورود

View Full Version : مبتدی: فهمیدن اسم آبجکت فرستنده سیگنال داخل اسلات



ehsan_faal
پنج شنبه 25 تیر 1394, 06:42 صبح
سلام.
من توی فرمم از QSpin ,QSlide چند تا جفت دارم.
چون QSlide فقط با int کار میکنه پس خودم یه اسلات نوشتم که مقدارش رو Scale کنم و بتونم تغییر وضعیت هر spin رو با slider خودش match کنم وبالعکس.
سوالم اینجاست که میشه کاری کردتوی نوشتن اسلاتها صرفه جویی کنم؟
یه اسلات بنویسم اگه سیگنال از spin اولی اومده بود مقدار slider اول رو تغییر بدم و ...

ممنون میشم راهنمایی کنید.

ehsan_faal
پنج شنبه 25 تیر 1394, 06:59 صبح
فکر کنم جوابو پیدا کردم:

void ConfigTab::setValueForDoubleQSlide(double value)
{
auto tmpValue=static_cast<int> (value*10);
auto tmpSender=sender()->objectName();
if(tmpSender=="spinLowerFreq")
ui->sldLowerFreq->setValue(tmpValue);
else if(tmpSender=="spinUpperFreq")
ui->sldUpperFreq->setValue(tmpValue);
}

chikar
پنج شنبه 25 تیر 1394, 12:44 عصر
سلام.
سوالم اینجاست که میشه کاری کردتوی نوشتن اسلاتها صرفه جویی کنم؟
یه اسلات بنویسم اگه سیگنال از spin اولی اومده بود مقدار slider اول رو تغییر بدم و ...


اگر هم می خواید خیلی صرفه جویی کنید در نوشتن اسلات، می تونید اصلا اسلاتی تعریف نکنید و از اسلات های پیش فرض خود slider و spinbox استفاده کنید، هر کدوم تغییر کنه، اون یکی هم تغییر می کنه! مثال :

connect(ui->verticalSlider,SIGNAL(valueChanged(int)),ui->spinBox,SLOT(setValue(int)));

connect(ui->spinBox,SIGNAL(valueChanged(int)),ui->verticalSlider,SLOT(setValue(int)));

ehsan_faal
پنج شنبه 25 تیر 1394, 19:58 عصر
نه آخه spin ها از نوع double هستند .این کار جوابگو نیست.

گر چه من الان مقدار spin رو ضربدر 10 میکنم و بعد میدم اسلایدر.
مقدار اسلایدر رو هم تقسیم بر 10 میکنم(رنج اسلایدر ها 10 برابر اسپسن هاست)
این cast ای که این وسط انجام مشه کارو بهم میریزه، بعضی وقتا اسپین از یه حد خاصی زیادتر نمیشه.
چرا تو کیوت اسلایدر دابل نداریم آخه؟

chikar
پنج شنبه 25 تیر 1394, 20:42 عصر
اینجا (http://stackoverflow.com/questions/19003369/how-to-make-a-qslider-change-with-double-values) یه مثال خوب هست، البته تو مایه های چیزی که خودت نوشتی!

ehsan_faal
جمعه 26 تیر 1394, 05:17 صبح
از اونجایی که ضرب و تقسیم به یه عدد ثابت به خاطر دقت دابل مشکل ساز میشد و بعضی وقتا خود به خود عدد گرد میشد و دیگه نمیشد با اسپین تغییرش داد(مخصوصا جاهایی که مثل کار من تا چند رقم اعشار از اسپین دقت بخواید)یه کم فکر کردم و این به ذهنم رسید وخیلی خوب جواب داد:
بالفرض که اسپینتون قراره از 2 تا 10 بشمره با دقتی به اندازه 2 رقم اعشار.
اسلایدر هم باید 2 تا 10 باشه (حالت عادی) الان همون رنج رو ضربدر 10 به توان تعداد اعشار اسپین میکنین یعنی اینجا میشه 200 تا 1000.

خب حالا این کد میتونه جایگزین اسلاتهای پیشفرض این دوتا (اسپین و اسلایدر) باشه:

#include "configtab.h"
#include "ui_configtab.h"
#include <QDebug>
#include <QtMath>
ConfigTab::ConfigTab(QWidget *parent) :
QWidget(parent),
ui(new Ui::ConfigTab)
{
ui->setupUi(this);
ConnectSigLot();
}

ConfigTab::~ConfigTab()
{
delete ui;
}
void ConfigTab::setQSliderValue(double value)
{
auto senderName=sender()->objectName();
if(senderName=="spinLowerFreq"){
const int ScaleFactor=qPow(10,ui->spinLowerFreq->decimals());
auto tmpValue=static_cast<int>((value+ui->spinLowerFreq->singleStep())*ScaleFactor);
ui->sldLowerFreq->setValue(tmpValue);
}else if(senderName=="spinUpperFreq"){
const int ScaleFactor=qPow(10,ui->spinUpperFreq->decimals());
auto tmpValue=static_cast<int>((value+ui->spinUpperFreq->singleStep())*ScaleFactor);
ui->sldUpperFreq->setValue(tmpValue);
}

}
void ConfigTab::setQSpinValue(int value)
{
auto senderName=sender()->objectName();
if(senderName=="sldLowerFreq"){
const int ScaleFactor=qPow(10,ui->spinLowerFreq->decimals());
auto tmpValue=static_cast<double>(value)/ScaleFactor;
ui->spinLowerFreq->setValue(tmpValue);
}else if(senderName=="sldUpperFreq"){
const int ScaleFactor=qPow(10,ui->spinUpperFreq->decimals());
auto tmpValue=static_cast<double>(value)/ScaleFactor;
ui->spinUpperFreq->setValue(tmpValue);
}


}
void ConfigTab::ConnectSigLot(void)
{
connect(ui->spinLowerFreq,SIGNAL(valueChanged(double)),this,SL OT(setQSliderValue(double)));
connect(ui->sldLowerFreq,SIGNAL(valueChanged(int)),this,SLOT(s etQSpinValue(int)));
connect(ui->spinUpperFreq,SIGNAL(valueChanged(double)),this,SL OT(setQSliderValue(double)));
connect(ui->sldUpperFreq,SIGNAL(valueChanged(int)),this,SLOT(s etQSpinValue(int)));
}



البته هنوز دوتا مشکل کوچیک هست.برای افزایش خوب کار میکنه ولی نمیشه مقدار اسپین رو کم کرد.
و اینکه اگه به صورت دستی توی اسپین عدد بدیم مثلا 3.25 خود به خود مقدارش عوض میشه مثلا میشه 3.27.
کسی ایده ای نداره؟