2016-03-30 13 views
1

У меня есть строка, где пользователь должен ввести 12-часовой формат времени. Это сенсорное приложение, и у меня есть собственная клавиатура, и у этой клавиатуры нет ":" (двоеточие) символ. Итак, для этой цели я использую маска ввода. Но у меня есть только опция setInputMask(99:99), которая позволяет пользователю вводить любое число, тогда как я должен ограничить пользователя 12-часовым форматом.Как использовать setValidator() и setInputMask() для QLineEdit в Qt?

Я прошел несколько примеров с помощью QRegexp, но у меня не могло быть «:», как во входной маске. Может ли кто-нибудь указать мне, как реализовать?

+0

Как насчет использования 'QTimeEdit'? – hank

+0

@hank Нет, я не могу использовать его здесь. Требования :) –

ответ

-1

Один из способов решения этой проблемы - установить installFilter для QLineEdit. Затем поймайте событие в eventFilter() и подтвердите ввод данных через QValidator или Qregex. Принять или отклонить на основе проверки.

Надеюсь, это поможет.

+0

, что перешло мне в голову ... но для такой мелочи? Должен быть лучший и гораздо более простой способ ... –

+0

Я не сказал, что это лучший способ. Я уверен, что есть другие способы. – savur

0

Хотя Qt Docs явно говорят, что мы будем «использовать маски вместе с валидаторами», если мы хотим, чтобы управление диапазоном находилось вне QLineEdits, это, похоже, не так уж и тривиально. По крайней мере, у других людей есть аналогичные проблемы. Но Mybe это помогает:

подклассы QLineEdit и переопределить focusInEvent() и setValidator() следующим образом:

----------------- mylineedit.h ------ ----------------

#ifndef MYLINEEDIT_H 
#define MYLINEEDIT_H 

#include <QLineEdit> 
#include <QFocusEvent> 
#include <QRegExpValidator> 

class MyLineEdit : public QLineEdit 
{ 
    Q_OBJECT 

private: 

    const QValidator *validator; 

public: 

    MyLineEdit(QWidget *parent = 0); 

    void setValidator(const QValidator *v); 

protected: 

    void focusInEvent(QFocusEvent *e); 
}; 

#endif // MYLINEEDIT_H 

------------------- mylineedit.cpp ----- --------------

#include "mylineedit.h" 

MyLineEdit::MyLineEdit(QWidget *parent): QLineEdit(parent) 
{ 

} 

void MyLineEdit::setValidator(const QValidator *v) 
{ 
    validator = v; 
    QLineEdit::setValidator(v); 
} 

void MyLineEdit::focusInEvent(QFocusEvent *e) 
{ 
    Q_UNUSED(e); 
    clear(); 
    setInputMask(""); 
    setValidator(validator); 
} 

Для самого MyLineEdit объекта мы используем QRegExp, чтобы разрешить вводить время только в 12-часовом формате без двоеточия в этой точке: 1152, например. Когда пользователь заканчивает редактирование, lineedit получает InpuMask формы "HH:HH", которая составляет от 1152 до 11:52. Фокус очищается. Если пользователь снова обращается к линии, он очищается, и QRegExp снова устанавливается, и пользователь вводит новое время 1245, например. и так далее ...

--------------------- rootwindow.h ---------------- ----

#ifndef ROOTWINDOW_H 
#define ROOTWINDOW_H 

#include "mylineedit.h" 
#include <QMainWindow> 
#include <QWidget> 
#include <QtDebug> 

class RootWindow : public QMainWindow 
{ 
    Q_OBJECT 

private: 

    QWidget *widgetCentral; 
    MyLineEdit *line; 

public: 

    RootWindow(QWidget *parent = 0); 
    ~RootWindow(); 

private slots: 

    void slotLineEdited(); 
}; 

#endif // ROOTWINDOW_H 

-------------- rootwindow.cpp ----------------------

#include "rootwindow.h" 

RootWindow::RootWindow(QWidget *parent): QMainWindow(parent) 
{ 
    setCentralWidget(widgetCentral = new QWidget); 

    line = new MyLineEdit(widgetCentral); 
    line->setValidator(new QRegExpValidator( QRegExp("[0][0-9][0-5][0-9]|[1][0-2][0-5][0-9]") )); 

    connect(line, SIGNAL(editingFinished()), this, SLOT(slotLineEdited())); 
} 

RootWindow::~RootWindow() 
{ 

} 

void RootWindow::slotLineEdited() 
{ 
    line->setInputMask("HH:HH"); 
    line->clearFocus(); 
} 

---------------------- main.cpp ------------------ --------

#include "rootwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    RootWindow w; 
    w.show(); 

    return a.exec(); 
} 

Похоже, что немного сверху, но на самом деле это не так уж много нового кода, и вам не нужен ключ двоеточия на вашей клавиатуре.

Смежные вопросы