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 | |
|
|