Пример "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(). Это позволяет пользователю включить или отключить ввод в однострочный редактор.
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |