Класс LayoutManager реализует табличную компоновку виджетов. Прототип метода добавления виджетов в Layout: void QGridLayout::add +--------- | ---------+ Размерность таблицы вычисляется автоматически LayoutManager'ом и может изменяться динамически при добавлении элементов в Layout. #include #include int main(int argc,char** argv[]){ QApplication a(argc,argv); QWidget *w=window QWidget(); QVBoxLayout *vlay=newQVBoxLayout(w); vlay->addWidget(new QLineEdit(w)); QGridLayout *glay=new QGridLayout(w); for (int i=0;i<3;++i) for (int j=0;j<3;++j) glay->addWidget( new QPushButton(QString().setNum(((3-i)*3+j))); vlay-> +--------- | ---------+ Валидатор -- программный механизм, позволяющий проверять корректность ввода данных пользователем. То есть, например, если в окне регистрационной формы пользователь должен ввести своё имя, то для ввода используется текстовое поле, однако пользователь может ввести туда другие символы. Для корректировки правильность ввода существуют числовые и строковые валидаторы. В основе иерархии валидаторов лежит абстрактный класс QValidator, от которого наследуется класс QIntValidator -- валидатор корректности ввода интегральных числовых значений, QDoubleValidator -- обеспечивает корректность ввода действительных значений, QRegExpValidator -- для корректности ввода строковых значений. QIntValidator(QObject *parent); Для установки диапазона допустимых значений используется метод setRange:void QIntValidator.setRange(int bottom, int top) setValidator:void inlineEdit::setValidator(const QValidator*) Для обеспечения корректности ввода строковой информации используется метод QRegExpValidator, который осуществляет соответствие вводимой текстовой строки текстовому шаблону, задаваемому регулярным выражением. В поле Name можно ввести только русское имя без пробела, в поле Mark -- число от 0 до 100. QTextCodec *codec=QTextCodec::codecForName("UTF-8") QTextCodec::setCodecForCStrings(codec); QWidget w(NULL); QGridLayout *lay=new QGridLayout(&w); lay->addWidget(new QLabel("name:",&w),0,0); QLineEdit *name=new QLineEdit(&w); QRegExp regExpr("[A-Ча-я]{0,25}"); QRegExpValidator* nameValidator=new QRegExpValidator(regExpr,name); name->setValidator(nameValidator); lay->addWidget(name,0,1); lay->addWidget(new QLabel("mark:",&w),1,0); QLineEdit *mark=new QLineEdit(&w); QIntValidator* markValidator=new QIntValidator(mark); markValidator->setRange(0,100); mark->setValidator(markValidator); lay->addWidget(mark,1,1); w.setLayout(lay); Использование валидаторов в стиле объектно-ориентированного программирования Напишем класс окна, который наследует QWidget. В его конструкторе создадим кнопку и текстовое поле и разместим их на окне. Создадим три файла, которые содержат описание классов окна, определение методов окна и создание объектов окна. #Файл wind.h #include class wnd:public QWidget{ Q_OBJECT public: wnd(QWidget* parent=0); private: QLineEdit* e; QPushButton* b; #Файл wnd.cpp #include "wnd.h" wnd::wnd(QWidget* parent); QWidget(parent){ e=new QLineEdit(this); b=new QPushButton("Button",this); QVBoxLayout *vlay=new QVBoxLayout(this); vlay->addWidget(e); vlay->addWidget(b); this->setLayout(vlay); } #Файл main.cpp #include #include "wnd.h" int main(int argc,char** argv){ QApplication a(argc,argv); wnd *w=new Wnd(NULL); wnd.show(); } Пример для создания вложенных Layout'ов: создадим вертикальный Layout и вложим в него несколько горизонтальных. Для добавления Layout'а в Layout используем метод addLayout. //Файл wnd.h #include class wnd:public QWidget{ Q_OBJECT public: wnd(QWidget* parent=0); private: QLineEdit *c; QPushButton *b; QCheckBox *ch; } //Файл wnd.cpp #include "wnd.h" wnd::wnd(QWidget *parent); QWidget:(parent){ l=new QLineEdit(this); b=new QPushButton("Button",this); c=new QCheckBox("CheckBox",this); QVBoxLayout* vlay=new QVBoxLayout(this); QHBoxLayout* h1=new QHboxLayout(this); QHBoxLayout* h2=new QHBoxLayout(this); h1->addWidget(new QLabel("Label",this); h1->addWidget(e); h2->addWidget(new QLabel("Label2",this); vlay->addLayout(h1); vlay->addLayout(h2); vlay->addWidget(b); this->setLayout(vlay); Обработка событий