ورود

View Full Version : مبتدی: تبدیلات عددی درست انجام نمیشه چرا؟



iambehnam
یک شنبه 19 خرداد 1392, 12:28 عصر
سلام به همه‌ی دوستان عزیز

مرتب نوشتم که اعتراض نکنیدا:بامزه:
این کد کوچولو (کپی از کتاب the-book-of-qt4) اجرا میشه ولی درست کار نمیده
قسمت main و header چیز خاصی نداشت. قسمت مورد سؤال:
// byteConverter/ByteConverterDialog.cpp
#include "byteconverterdialog.h"
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QValidator>


ByteConverterDialog::ByteConverterDialog()
{
// Generate the necessary layouts
QVBoxLayout* mainLayout = new QVBoxLayout(this);
QGridLayout* editLayout = new QGridLayout;
QHBoxLayout* buttonLayout = new QHBoxLayout;
mainLayout->addLayout(editLayout);
mainLayout->addStretch();
mainLayout->addLayout(buttonLayout);

// Generate the labels and line-edits and add them
// to the object pointed at by editLayout
QLabel* decLabel = new QLabel(tr("Decimal"));
QLabel* hexLabel = new QLabel(tr("Hex"));
QLabel* binLabel = new QLabel(tr("Binary"));
decEdit = new QLineEdit;
hexEdit = new QLineEdit;
binEdit = new QLineEdit;

editLayout->addWidget(decLabel, 0, 0);
editLayout->addWidget(decEdit, 0, 1);
editLayout->addWidget(hexLabel, 1, 0);
editLayout->addWidget(hexEdit, 1, 1);
editLayout->addWidget(binLabel, 2, 0);
editLayout->addWidget(binEdit, 2, 1);

// Create the Quit button and add it to the object pointed
// at by buttonLayout
QPushButton* exitButton = new QPushButton(tr("Quit"));
buttonLayout->addStretch();
buttonLayout->addWidget(exitButton);
exitButton->setDefault(true);
connect(exitButton, SIGNAL(clicked()), this, SLOT(accept()));

// Limit input to valid values
QIntValidator* decValidator = new QIntValidator(0, 255, decEdit);
decEdit->setValidator(decValidator);
QRegExpValidator* hexValidator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,2}"), hexEdit);
hexEdit->setValidator(hexValidator);
QRegExpValidator* binValidator = new QRegExpValidator(QRegExp("[01]{1,8}"), binEdit);
binEdit->setValidator(binValidator);

setWindowTitle(tr("Byte Converter"));
connect(decEdit, SIGNAL(textChanged(const QString&)), this, SLOT(decChanged(const QString&)));
connect(hexEdit, SIGNAL(textChanged(const QString&)), this, SLOT(hexChanged(const QString&)));
connect(binEdit, SIGNAL(textChanged(const QString&)), this, SLOT(binChanged(const QString&)));
}


void ByteConverterDialog::decChanged(const QString& newValue)
{
bool ok;
int num = newValue.toInt(&ok);
if (ok) {
hexEdit->setText(QString::number(num, 16));
binEdit->setText(QString::number(num, 2));
} else {
hexEdit->setText("");
binEdit->setText("");
}
}


void ByteConverterDialog::hexChanged(const QString& newValue)
{
bool ok;
int num = newValue.toInt(&ok);
if (ok) {
decEdit->setText(QString::number(num));
binEdit->setText(QString::number(num, 2));
} else {
decEdit->setText("");
binEdit->setText("");
}
}


void ByteConverterDialog::binChanged(const QString& newValue)
{
bool ok;
int num = newValue.toInt(&ok);
if (ok) {
decEdit->setText(QString::number(num));
hexEdit->setText(QString::number(num, 16));
} else {
decEdit->setText("");
hexEdit->setText("");
}
}

بنظرتون مشکل چیه؟

iambehnam
دوشنبه 20 خرداد 1392, 11:46 صبح
چرا کسی به ما مبتدیا اهمیت نمیده؟
یا جوابشو پیدا نکردید؟
لازمه بقیه کد را هم بذارم؟
لطفا کمک کنید
ممنون

rubiks.kde
دوشنبه 20 خرداد 1392, 13:27 عصر
دوست عزیز دقیقا سوالت چیه ؟؟؟
الان توی این کدی که گذاشتی ، خودتم خوب خوندی کد رو ؟؟؟؟؟؟؟؟؟؟؟؟
اصلا توی این کد تبدیل عددی صورت میگیره ؟؟؟؟؟؟؟؟

دوست عزیز این تکه کدی که شما گذاشتی فقط داره یه dialog رو میسازه و و هیچ کار دیگه ایی هم نمیکنه و سه تا slot رو به linteditها وصل میکنه البته یکی از این ها عدد میگیره یکی عدد هگز و دیگری باینری

والا نمیدونم مشکل شما الان دقیقا باکجای این کد هست.چون این فقط مربوط میشه به ساخت یه dialog ساده:متفکر:

iambehnam
دوشنبه 20 خرداد 1392, 15:49 عصر
ببین در سه تابع decchanged , ... اگر مقداری در دیالوگ مربوطه باشه ok=true و مقدارش توسط int num = newValue.toInt(&ok); به سحیح تبدیل و در num ذخیره میشه و توسط دو دستور داخل if به دو مبنای دیگه تغییر میکنه (طبق کتاب) و اگر ok=false باشه (یعنی newvalue نداشته باشیم در قسمت else دو دیالوگ دیگه خالی نمایش داده میشه
اما این عمل درست انجام نمیشه! و حتی نمیشه به دیالوگ‌ها مقادیری غیر از صف و یک یا a داد درحالیکه اولی 0 تا 255 دادم و دومی 0-9 و a-f و سومی فقط صفر و یک. و تعداد ارقام هم مشخصه ولی در اجرا فقط یک رقم میشه داد؟
// byteConverter/main.cpp
#include <QApplication>
#include "byteconverterdialog.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ByteConverterDialog bc;
bc.setAttribute(Qt::WA_QuitOnClose);
bc.show();
return a.exec();
}
// byteConverter/ByteConverterDialog.h
#ifndef BYTECONVERTERDIALOG_H
#define BYTECONVERTERDIALOG_H
#include <QDialog>
class QLineEdit;

class ByteConverterDialog : public QDialog
{
Q_OBJECT
public:
ByteConverterDialog();
private:
QLineEdit* decEdit;
QLineEdit* hexEdit;
QLineEdit* binEdit;
private slots:
void decChanged(const QString&);
void hexChanged(const QString&);
void binChanged(const QString&);
};
#endif
یه بار اجراش کنید و نتیجه را بررسی کنید و کمکم کنید چون دومین تمرینمه و دومین ایراد من. اگه این طوری پیش بره هیچ وقت چیزی یاد نمیگیرم
منتظرما . ممنون

rubiks.kde
سه شنبه 21 خرداد 1392, 06:55 صبح
سلام دوست عزیز برنامه رو اجرا کردم و مشکلش حل شد.
مشکلشم توی slot ها هستش این تیکه کد شما باید برای هر اسلات فرق کنه
int num = newValue.toInt(&ok);
چرا ؟؟ چون توی هر LineEdit مقدار جدیدی که وارد میشه newValue نوعش با بقیه فرق میکنه ولی شما توی تمام LineEdit های بیس تبدیل رو 10 گرفتید

در واقع تابع toInt دوتا پارامتر داره که پارامتر دوم میگه این مقداری که قراره به int تبدیل بشه نوعش چیه ، مثلا زمانی که اسلات مربوط به هگز کار میکنه و میخوایی مقدارش رو به int تبدیل کنی باید بهش بگی که این مقدار من هگز هست و برای بقیه هم همین طور فقط برای مبنای 10 لازم نیست چون default این تابع مبناش 10 هست.

پس slot ها رو به این صورت تغییر بده(تغییر که نه ولی پارامتر دوم رو بده به تابع toInt)

برای اسلات decChanged هیج تغییری لازم نیست ولی بقیه رو این طوری تغییر بده

اسلات hexChanged

int num = newValue.toInt(&ok,16);

اسلات binChanged

int num = newValue.toInt(&ok,2);

امیدوارم پی به قضیه برده باشی:لبخندساده:

iambehnam
سه شنبه 21 خرداد 1392, 09:29 صبح
ممنون دوست من. لطف کردی.
حواسم به ین متفاوت بودن ورودی بود ولی اصلا حواسم به پارامتر دوم نبود (آخه اگه دقت میکردم داخل if نمونه اش بود) و من فکر میکردم باید بجای toInt از چیز دیگه استفاده کنم.:لبخندساده:
بهم نخند، خوب مبتدیم دیگه !
خیلی ممنون