Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

C++ GUI Programming with Qt 3 BRUCE PERENS' OPEN SOURCE SERIES

Бибилиотека Qt появилась в 1995 году . Она была разработана 2-мя норвежцами . Qt портирован как под винду , так и под линукс . Ниже приведен код "Hello World" на Qt :
 
  #include < qapplication.h>
  #include < qlabel.h>
  int main(int argc, char *argv[])
  {
    QApplication app(argc, argv);
    QLabel *label = new QLabel("Hello , World!", 0);
    app.setMainWidget(label);
    label->show();
    return app.exec();
  }
 
Для компиляции этой программы на машине как минимум должен стоять Qt 3.2 , при этом его каталог /bin должен присутствовать в пути PATH . Сначала нужно создать файл проекта qmake hello.pro
      qmake -project
Потом нужно создать makefile
      qmake hello.pro
Теперь компиляция make Можно модифицировать приложение и привести строку к html-формату :
     QLabel *label = new QLabel(" < h2>Hello< f ont color = red > Qt!', 0);
Если добавить следующий код :
         QPushButton *button = new QPushButton("Quit", 0);
         QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
то на видгете появится кнопка , и при ее нажатии приложение захлопнется . В следующем примере будут присутствовать спин-блкс и слайдер , которые будут синхронизированы. В приложении 3 видгета - QSpinBox, QSlider, QHBox .
 #include  < qapplication.h>
  #include < qhbox.h>
  #include < qslider.h>
  #include < qspinbox.h>
  int main(int argc, char *argv[])
  {
  QApplication app(argc, argv);
  QHBox *hbox = new QHBox(0);
  hbox->setCaption("Enter Your Age");
  hbox->setMargin(6);
  hbox->setSpacing(6);
  QSpinBox *spinBox = new QSpinBox(hbox);
  QSlider *slider = new QSlider(Qt::Horizontal, hbox);
  spinBox->setRange(0, 130);
  slider->setRange(0, 130);
  QObject::connect(spinBox, SIGNAL(valueChanged(int)),
  slider, SLOT(setValue(int)));
  QObject::connect(slider, SIGNAL(valueChanged(int)),
  spinBox, SLOT(setValue(int)));
  spinBox->setValue(35);
  app.setMainWidget(hbox);
  hbox->show();
  return app.exec();
 }
Qt 3.2 включает порядка 400 классов и 6000 функций . Документацию по qt можно найти в его подкаталоге \doc\html , либо запустить Qt Assistant, набрав команду assistant . Иерархия классов в qt следующая :
                              Qt QObject
                   QApplication       QWidget
                                 QButton QFrame QSlider QSpinBox
                                    	 QPushButton QHBox QLabel
Для визуального моделирования существует программа Qt Designer . Напишем диалоговую программу Find dialog . В проекте 3 файла : сначала хидер finddialog.h :
  #ifndef FINDDIALOG_H
  #define FINDDIALOG_H
  #include < qdialog.h>
  class QCheckBox;
  class QLabel;
  class QLineEdit;
  class QPushButton;
  class FindDialog : public QDialog
  {
  Q_OBJECT
  public:
  FindDialog(QWidget *parent = 0, const char *name = 0);
  signals:
  void findNext(const QString &str, bool caseSensitive);
  void findPrev(const QString &str, bool caseSensitive);
  private slots:
  void findClicked();
  void enableFindButton(const QString &text);
  private:
  QLabel *label;
  QLineEdit *lineEdit;
  QCheckBox *caseCheckBox;
  QCheckBox *backwardCheckBox;
  QPushButton *findButton;
  QPushButton *closeButton;
  };
  #endif
 
В классе декларируются 2 слота - слот похож на сигнал . 2-й файл finddialog.cpp :
  #include 
  #include 
  #include 
  #include 
  #include 
  #include "finddialog.h"
  FindDialog::FindDialog(QWidget *parent, const char *name)
  : QDialog(parent, name)
  {
  setCaption(tr("Find"));
  label = new QLabel(tr("Find &what:"), this);
  lineEdit = new QLineEdit(this);
  label->setBuddy(lineEdit);
  caseCheckBox = new QCheckBox(tr("Match &case"), this);
  backwardCheckBox = new QCheckBox(tr("Search &backward"), this);
  findButton = new QPushButton(tr("&Find"), this);
  findButton->setDefault(true);
  findButton->setEnabled(false);
  closeButton = new QPushButton(tr("Close"), this);
  connect(lineEdit, SIGNAL(textChanged(const QString &)),
  this, SLOT(enableFindButton(const QString &)));
  connect(findButton, SIGNAL(clicked()),
  this, SLOT(findClicked()));
  connect(closeButton, SIGNAL(clicked()),
  this, SLOT(close()));
  QHBoxLayout *topLeftLayout = new QHBoxLayout;
  topLeftLayout->addWidget(label);
  topLeftLayout->addWidget(lineEdit);
  QVBoxLayout *leftLayout = new QVBoxLayout;
  leftLayout->addLayout(topLeftLayout);
  leftLayout->addWidget(caseCheckBox);
  leftLayout->addWidget(backwardCheckBox);
  QVBoxLayout *rightLayout = new QVBoxLayout;
  rightLayout->addWidget(findButton);
  rightLayout->addWidget(closeButton);
  rightLayout->addStretch(1);
  QHBoxLayout *mainLayout = new QHBoxLayout(this);
  mainLayout->setMargin(11);
  mainLayout->setSpacing(6);
  mainLayout->addLayout(leftLayout);
  mainLayout->addLayout(rightLayout);
  }
  void FindDialog::findClicked()
  {
  QString text = lineEdit->text();
  bool caseSensitive = caseCheckBox->isOn();
  if (backwardCheckBox->isOn())
  emit findPrev(text, caseSensitive);
  else
  emit findNext(text, caseSensitive);
  }
  void FindDialog::enableFindButton(const QString &text)
  {
  findButton->setEnabled(!text.isEmpty());
  }
 3-й файл main.cpp
  #include 
  #include "finddialog.h"
  int main(int argc, char *argv[])
  {
  QApplication app(argc, argv);
  FindDialog *dialog = new FindDialog;
  app.setMainWidget(dialog);
  dialog->show();
  return app.exec();
  }
Сначала запускаем
    qmake
При этом будет сгенерирован дополнительный хидер . Теперь
    make
У полученной программы есть несколько недостатков . Кнрпка ОК задисэблена , текст набирается произвольный . Добавим код :
 #include < qvalidator.h>
 void GoToCellDialog::init()
 {
 QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
 lineEdit->setValidator(new QRegExpValidator(regExp, this));
 }
 void GoToCellDialog::enableOkButton()
 {
 okButton->setEnabled(lineEdit->hasAcceptableInput());
 }
После этого,откомпилировав программу и набрав текст,увидим,что ОК станет активирована. В qt можно создавать диалоги с изменяемой формой . Они могут быть 2-х типов : extension dialogs и multi-page dialogs. Первые позволяют , например , при нажатии на кнопку отрисовывать у диалога дополнительные опции .
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье
sss
  ssss
2011-09-08 13:19:37