Хотя 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();
}
Похоже, что немного сверху, но на самом деле это не так уж много нового кода, и вам не нужен ключ двоеточия на вашей клавиатуре.
Как насчет использования 'QTimeEdit'? – hank
@hank Нет, я не могу использовать его здесь. Требования :) –