Пример "Line Edits"
Файлы:
Пример "Line Edits" демонстрирует много способов использования QLineEdit, а также показывает эффекты различных свойств и валидаторов ввода и вывода, предоставляемых пользователем.

Пример состоит из одного класса Window, содержащего набор однострочных редакторов с разными ограничениями ввода и свойствами отображения, которые можно изменить выбрав нужные пункты в выпадающих списках. Всё это вместе помогает разработчикам выбирать подходящие свойства для использования в однострочных редакторах, а также облегчает сравнение эффектов каждого валидатора пользовательского ввода.
Определение класса Window
Класс Window унаследован от QWidget и содержит конструктор и несколько слотов:
class Window : public QWidget
{
Q_OBJECT
public:
Window();
public slots:
void echoChanged(int);
void validatorChanged(int);
void alignmentChanged(int);
void inputMaskChanged(int);
void accessChanged(int);
private:
QLineEdit *echoLineEdit;
QLineEdit *validatorLineEdit;
QLineEdit *alignmentLineEdit;
QLineEdit *inputMaskLineEdit;
QLineEdit *accessLineEdit;
};
Слоты используются для обновления типа валидатора, применяемого к заданному однострочному редактору когда в соответствующем выпадающем списке выбран новый валидатор. Однострочные редакторы хранятся в окне для использования в этих слотах.
Реализация класса Window
Конструктор Window используется для настройки однострочных редакторов, валидаторов и выпадающих списков, соединяет сигналы из выпадающих списков со слотами в классе Window, а также расположения дочерних виджетов в компоновках.
Начинаем с создания групповой рамки для размещения метки, выпадающего списка и однострочного редактора для того, чтобы можно было продемонстрировать свойство QLineEdit::echoMode:
Window::Window()
{
QGroupBox *echoGroup = new QGroupBox(tr("Echo"));
QLabel *echoLabel = new QLabel(tr("Mode:"));
QComboBox *echoComboBox = new QComboBox;
echoComboBox->addItem(tr("Normal"));
echoComboBox->addItem(tr("Password"));
echoComboBox->addItem(tr("PasswordEchoOnEdit"));
echoComboBox->addItem(tr("No Echo"));
echoLineEdit = new QLineEdit;
echoLineEdit->setFocus();
Пока что ни один из этих виджетов не расположен в компоновках. В итоге, echoLabel, echoComboBox и echoLineEdit будут помещены в вертикальную компоновку внутри групповой рамки echoGroup.
Аналогичным образом создаем групповые рамки и коллекции виджетов, чтобы показать эффекты QIntValidator и QDoubleValidator на содержимом однострочного редактора:
QGroupBox *validatorGroup = new QGroupBox(tr("Validator"));
QLabel *validatorLabel = new QLabel(tr("Type:"));
QComboBox *validatorComboBox = new QComboBox;
validatorComboBox->addItem(tr("No validator"));
validatorComboBox->addItem(tr("Integer validator"));
validatorComboBox->addItem(tr("Double validator"));
validatorLineEdit = new QLineEdit;
Выравнивание текста демонстрируется в другой группе виджетов:
QGroupBox *alignmentGroup = new QGroupBox(tr("Alignment"));
QLabel *alignmentLabel = new QLabel(tr("Type:"));
QComboBox *alignmentComboBox = new QComboBox;
alignmentComboBox->addItem(tr("Left"));
alignmentComboBox->addItem(tr("Centered"));
alignmentComboBox->addItem(tr("Right"));
alignmentLineEdit = new QLineEdit;
QLineEdit поддерживает использование масок ввода. Только они позволяют пользователю набирать на клавиатуре символы в однострочном редакторе, которые поддерживают простую спецификацию. Создаём группу виджетов чтобы продемонстрировать выбор предопределённых масок:
QGroupBox *inputMaskGroup = new QGroupBox(tr("Input mask"));
QLabel *inputMaskLabel = new QLabel(tr("Type:"));
QComboBox *inputMaskComboBox = new QComboBox;
inputMaskComboBox->addItem(tr("No mask"));
inputMaskComboBox->addItem(tr("Phone number"));
inputMaskComboBox->addItem(tr("ISO date"));
inputMaskComboBox->addItem(tr("License key"));
inputMaskLineEdit = new QLineEdit;
Другой полезной возможностью QLineEdit является его способность сделать своё содержимое доступным только для чтения. Это свойство используется для управления доступом к однострочному редактору в следующих группах виджетов:
QGroupBox *accessGroup = new QGroupBox(tr("Access"));
QLabel *accessLabel = new QLabel(tr("Read-only:"));
QComboBox *accessComboBox = new QComboBox;
accessComboBox->addItem(tr("False"));
accessComboBox->addItem(tr("True"));
accessLineEdit = new QLineEdit;
Теперь, когда все дочерние виджеты созданы, соединяем сигналы выпадающих списков со слотами в объекте Window:
connect(echoComboBox, SIGNAL(activated(int)),
this, SLOT(echoChanged(int)));
connect(validatorComboBox, SIGNAL(activated(int)),
this, SLOT(validatorChanged(int)));
connect(alignmentComboBox, SIGNAL(activated(int)),
this, SLOT(alignmentChanged(int)));
connect(inputMaskComboBox, SIGNAL(activated(int)),
this, SLOT(inputMaskChanged(int)));
connect(accessComboBox, SIGNAL(activated(int)),
this, SLOT(accessChanged(int)));
Все эти соединения используют сигнал QComboBox::activated(), который доставляет целое число в слот. Это будет использовано для рационального изменения в соответствующем однострочном редакторе каждого слота.
Поместим каждый выпадающий список, однострочный редактор и метку в компоновку для всех групповых рамок, начиная с компоновки для групповой рамки echoGroup:
QGridLayout *echoLayout = new QGridLayout;
echoLayout->addWidget(echoLabel, 0, 0);
echoLayout->addWidget(echoComboBox, 0, 1);
echoLayout->addWidget(echoLineEdit, 1, 0, 1, 2);
echoGroup->setLayout(echoLayout);
Остальные компоновки создаются аналогичным способом:
QGridLayout *validatorLayout = new QGridLayout;
validatorLayout->addWidget(validatorLabel, 0, 0);
validatorLayout->addWidget(validatorComboBox, 0, 1);
validatorLayout->addWidget(validatorLineEdit, 1, 0, 1, 2);
validatorGroup->setLayout(validatorLayout);
QGridLayout *alignmentLayout = new QGridLayout;
alignmentLayout->addWidget(alignmentLabel, 0, 0);
alignmentLayout->addWidget(alignmentComboBox, 0, 1);
alignmentLayout->addWidget(alignmentLineEdit, 1, 0, 1, 2);
alignmentGroup-> setLayout(alignmentLayout);
QGridLayout *inputMaskLayout = new QGridLayout;
inputMaskLayout->addWidget(inputMaskLabel, 0, 0);
inputMaskLayout->addWidget(inputMaskComboBox, 0, 1);
inputMaskLayout->addWidget(inputMaskLineEdit, 1, 0, 1, 2);
inputMaskGroup->setLayout(inputMaskLayout);
QGridLayout *accessLayout = new QGridLayout;
accessLayout->addWidget(accessLabel, 0, 0);
accessLayout->addWidget(accessComboBox, 0, 1);
accessLayout->addWidget(accessLineEdit, 1, 0, 1, 2);
accessGroup->setLayout(accessLayout);
В заключение, поместим каждую групповую рамку в компоновку-сетку в объекте Window и установим заголовок окна:
QGridLayout *layout = new QGridLayout;
layout->addWidget(echoGroup, 0, 0);
layout->addWidget(validatorGroup, 1, 0);
layout->addWidget(alignmentGroup, 2, 0);
layout->addWidget(inputMaskGroup, 0, 1);
layout->addWidget(accessGroup, 1, 1);
setLayout(layout);
setWindowTitle(tr("Line Edits"));
}
Слоты отвечают на сигналы, отправленные когда выпадающие списки были изменены пользователем.
Когда выпадающий список для групповой рамки Echo изменился, вызывается слот echoChanged():
void Window::echoChanged(int index)
{
switch (index) {
case 0:
echoLineEdit->setEchoMode(QLineEdit::Normal);
break;
case 1:
echoLineEdit->setEchoMode(QLineEdit::Password);
break;
case 2:
echoLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
break;
case 3:
echoLineEdit->setEchoMode(QLineEdit::NoEcho);
}
}
Слот обновляет однострочный редактор в той же групповой рамке для использования режима эхо, который соответствует записи, описываемой в выпадающем списке.
Когда выпадающий список для групповой рамки Validator изменился, вызывается слот validatorChanged():
void Window::validatorChanged(int index)
{
switch (index) {
case 0:
validatorLineEdit->setValidator(0);
break;
case 1:
validatorLineEdit->setValidator(new QIntValidator(
validatorLineEdit));
break;
case 2:
validatorLineEdit->setValidator(new QDoubleValidator(-999.0,
999.0, 2, validatorLineEdit));
}
validatorLineEdit->clear();
}
Слот либо создаёт новый валидатор для использования с однострочным редактором, либо удаляет используемый валидотор вызвав QLineEdit::setValidator() с нулевым указателем. В этом случае очищаем однострочный редактор, чтобы гарантировать, что новый валидатор изначально предоставляет корректный ввод для работы.
Когда выпадающий список для групповой рамки Alignment изменился, вызывается слот alignmentChanged():
void Window::alignmentChanged(int index)
{
switch (index) {
case 0:
alignmentLineEdit->setAlignment(Qt::AlignLeft);
break;
case 1:
alignmentLineEdit->setAlignment(Qt::AlignCenter);
break;
case 2:
alignmentLineEdit->setAlignment(Qt::AlignRight);
}
}
Это изменяет способ, которым отображается текст однострочного редактора, для согласования с описанием выбранным в выпадающем списке.
Слот inputMaskChanged() обрабатывает изменения в выпадающем списке групповой рамки Input Mask:
void Window::inputMaskChanged(int index)
{
switch (index) {
case 0:
inputMaskLineEdit->setInputMask("");
break;
case 1:
inputMaskLineEdit->setInputMask("+99 99 99 99 99;_");
break;
case 2:
inputMaskLineEdit->setInputMask("0000-00-00");
inputMaskLineEdit->setText("00000000");
inputMaskLineEdit->setCursorPosition(0);
break;
case 3:
inputMaskLineEdit->setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");
}
}
Каждая запись в соответствующем выпадающем списке объединены с маской ввода. Устанавливаем новую маску вызывая функцию QLineEdit::setMask() с соответствующей строкой; маска отключена, если используется пустая строка.
Слот accessChanged() обрабатывает изменения в выпадающем списке в групповой рамке Access:
void Window::accessChanged(int index)
{
switch (index) {
case 0:
accessLineEdit->setReadOnly(false);
break;
case 1:
accessLineEdit->setReadOnly(true);
}
}
Здесь мы просто связываем записи False и True в выпадающем списке со значениями false и true чтобы передать в QLineEdit::setReadOnly(). Это позволяет пользователю включить или отключить ввод в однострочный редактор.
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|