<b>QBoxLayout::addLayout(QLayout *layout, int stretch = 0);</b>
Выполните упражнение 17.3.
Упражнение 17.3. Применение классов QBoxLayout
В этом примере вы увидите в действии классы QBoxLayout при размещении виджетов QLabel в окне QMainWindow.
1. Сначала введите заголовочный файл LayoutWindow.h:
#include <qmainwindow.h>
class LayoutWindow : public QMainWindow {
QOBJECT
public:
LayoutWindow(QWidget *parent = 0, const char *name = 0);
virtual ~LayoutWindow();
};
2. Теперь введите реализацию в файл LayoutWindow.cpp:
#include <qapplication.h>
#include <qlabel.h>
#include <qlayout.h>
#include "LayoutWindow.moc"
LayoutWindow::LayoutWindow(QWidget* parent, const char *name) :
QMainWindow(parent, name) {
this->setCaption("Layouts");
3. Необходимо создать фиктивный QWidget для хранения объекта QHBoxLayout, поскольку его нельзя напрямую вставить в объект QMainWindow:
QWidget *widget = new QWidget(this);
setCentralWidget(widget);
QHBoxLayout *horizontal = new QHBoxLayout(widget, 5, 10, "horizontal");
QVBoxLayout *vertical = new QVBoxLayout();
QLabel* label1 = new QLabel("Top", widget, "textLabel1");
QLabel* label2 = new QLabel("Bottom", widget, "textLabel2");
QLabel* label3 = new QLabel("Right", widget, "textLabel3");
vertical->addwidget(label1);
vertical->addwidget(label2);
horizontal->addLayout(vertical);
horizontal->addWidget(label3);
resize(150, 100);
}
LayoutWindow::~LayoutWindow() { }
int main(int argc, char **argv) {
QApplication app(argc, argv);
LayoutWindow *window = new LayoutWindow();
app.setMainWidget(window);
window->show();
return app.exec();
}
Как и прежде, перед компиляцией нужно выполнить moc для заголовочного файла:
$ <b>moc LayoutWindow.h -о LayoutWindow.moc</b>
$ <b>g++ -о layout LayoutWindow.cpp -I$QTDIR/include -L$QTDIR/lib -lqui</b>
Выполнив эту программу, вы получите схему размещения ваших меток QLabel (рис. 17.4). Попробуйте изменить величину окна и посмотрите, как расширяются и сжимаются метки, заполняя все доступное пространство.
Рис. 17.4
Как это работает
Программа LayoutWindow.cpp создает два виджета упаковочных контейнеров, горизонтальный и вертикальный контейнер для размещения виджетов. Вертикальный контейнер получает две метки, описанные, соответственно, как Top и Bottom. Горизонтальный контейнер также содержит два виджета, метку, обозначенную Right, и вертикальный контейнер. Вы можете помещать компоновочные виджеты внутрь других компоновочных виджетов, как показано в данном примере.
Попробуйте изменить исходный текст программы в файле LayoutWindow.срр, чтобы поэкспериментировать и лучше понять, как работают компоновочные виджеты.
Мы рассмотрели основы применения Qt — сигналы и слоты, команду moc и средства компоновки. Теперь пора более внимательно изучить виджеты.
Виджеты Qt
Для каждого случая в Qt есть виджеты, и их подробное рассмотрение займет всю оставшуюся часть книги. В этом разделе мы познакомимся с виджетами Qt общего применения, включая виджеты для ввода данных, кнопки, обычные и раскрывающиеся списки.
QLineEdit
QLineEdit — виджет для ввода однострочного текста. Применяйте его для ввода коротких фрагментов текста, таких как имя пользователя. В виджете QLineEdit можно ограничить длину вводимого текста с помощью маски ввода, предлагающей заполнить шаблон, или для дополнительного контроля можно применить функцию проверки допустимости, например, чтобы убедиться в том, что пользователь вводит корректные дату, номер телефона или подобные величины. У виджета QLineEdit есть функции редактирования, позволяющие выбирать части текста, вырезать и вставлять, отменять и повторять изменения, как командами пользователя, так и средствами API.
Далее перечислены конструкторы и наиболее полезные методы.
<b>#include <qlineedit.h></b>
<b>QLineEdit::QLineEdit(QWidget *parent, const char* name = 0);</b>
<b>QLineEdit::QLineEdit(const QString& contents, QWidget *parent,</b>
<b> const char *name = 0);</b>
<b>QLineEdit::QLineEdit(const QString& contents, const QString& inputMask,</b>
<b> QWidget *parent, const char* name = 0);</b>
<b>void setInputMask(const QString& inputMask);</b>
<b>void insert(const QString& newText);</b>
<b>bool isModified(void);</b>
<b>void setMaxLength(int length);</b>
<b>void setReadOnly(bool read);</b>