вторник, 2 сентября 2008 г.

Конвертер систем счисления

Решил написать простенькую программку - конвертер чисел в различные системы счисления. Скачать архив с программой и её и исходниками можно тут: QBase_sources.rar(10.4Кб). Сама программа написана на C++ с использованием кроссплатформенной графической библиотеки Qt.


Весь программный код описан ниже.

#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QComboBox>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>

class QBase : public QWidget
{
  Q_OBJECT
private:
  QComboBox *m_baseFrom, *m_baseTo;
  QLineEdit *m_inputNumber, *m_outputNumber;
public:
  QBase(QWidget *parent = 0, Qt::WFlags flags = 0);
  ~QBase();
private slots:
  void convert(const QString & text);
  void toConvert();
};

QBase::QBase(QWidget *parent, Qt::WFlags flags)
  : QWidget(parent, flags)
{
  QHBoxLayout *mainLayout = new QHBoxLayout(this);
  QVBoxLayout *leftLayout = new QVBoxLayout;
  QVBoxLayout *rightLayout = new QVBoxLayout;
  mainLayout->addLayout(leftLayout);
  mainLayout->addLayout(rightLayout);

  m_baseFrom = new QComboBox;
  leftLayout->addWidget(m_baseFrom);
  for (int i=2; i<=10; i++)
     m_baseFrom->addItem(QString("%1").arg(i));
  m_baseFrom->addItem("16");
  m_baseFrom->setCurrentIndex(8);

  m_baseTo = new QComboBox;
  rightLayout->addWidget(m_baseTo);
  for (int i=2; i<=10; i++)
     m_baseTo->addItem(QString("%1").arg(i));
  m_baseTo->addItem("16");
  m_baseTo->setCurrentIndex(9);

  m_inputNumber = new QLineEdit;
  leftLayout->addWidget(m_inputNumber);

  m_outputNumber = new QLineEdit;
  rightLayout->addWidget(m_outputNumber);
  m_outputNumber->setReadOnly(true);

  connect( m_inputNumber, SIGNAL(textChanged(QString)),
            this, SLOT(convert(QString)) );
  connect( m_baseFrom, SIGNAL(currentIndexChanged(int)),
            this, SLOT(toConvert()) );
  connect( m_baseTo, SIGNAL(currentIndexChanged(int)),
            this, SLOT(toConvert()) );

  m_inputNumber->setFocus(Qt::OtherFocusReason);
  setTabOrder(m_inputNumber, m_baseFrom);
  setTabOrder(m_baseFrom, m_baseTo);
  m_outputNumber->setFocusPolicy(Qt::NoFocus);
}

QBase::~QBase() {
  delete m_baseFrom;
  delete m_baseTo;
  delete m_inputNumber;
  delete m_outputNumber;
}

void QBase::convert(const QString & text) {
  bool b;
  int baseFrom = m_baseFrom->currentText().toInt(&b,10);
  int baseTo = m_baseTo->currentText().toInt(&b,10);
  QString str = QString("%1").arg(text.toInt(&b,baseFrom),0,baseTo);

  if (!m_inputNumber->text().length())
     m_outputNumber->setText("");
  else if (!b || (text[0]=='-') || (text[0]=='+'))
     m_outputNumber->setText("Invalid number");
  else
     m_outputNumber->setText(str);
}

void QBase::toConvert() {
  convert(m_inputNumber->text());
}

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);
  QBase w;
  w.show();
  a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
  return a.exec();
}


* This source code was highlighted with Source Code Highlighter.


Если установлен интегратор Qt в MicroSoft Visual Studio, то распакуйте исходники из архива в одну папку, запустите Visual Studio и в меню выберите пункт "Qt"->"Open Solution from .pro File" и укажите путь к файлу QBase.pro. В этом случае Visual Studio сама создаст проект.

1 комментарий:

agamemnon комментирует...

Такие вещи и виндовый калькулятор может делать неплохо. А вот если бы дрооообные числа твой конвертер считал