如何在Qt中对QLineEdit同时使用setValidator()和setInputMask()?

如何在Qt中对QLineEdit同时使用setValidator()和setInputMask()?,qt,qlineedit,qregexp,input-mask,Qt,Qlineedit,Qregexp,Input Mask,我有一个行编辑,用户必须以12小时的时间格式输入。这是一个基于触摸的应用程序,我有自己的键盘,但这个键盘没有“”:“(冒号)字符。因此,我使用了一个输入掩码。但是我只有setInputMask(99:99)选项,允许用户输入任何数字,而我必须将用户限制为12小时格式 我用QRegexp浏览了一些示例,但我不能在输入掩码中使用“:”之类的。有人能告诉我如何实现吗?尽管Qt文档明确表示,如果我们希望在outQLineEdits中进行范围控制,我们将“使用掩码和验证器”,但这似乎不是那么简单。至少其他

我有一个行编辑,用户必须以12小时的时间格式输入。这是一个基于触摸的应用程序,我有自己的键盘,但这个键盘没有“”:“(冒号)字符。因此,我使用了一个输入掩码。但是我只有
setInputMask(99:99)
选项,允许用户输入任何数字,而我必须将用户限制为12小时格式


我用QRegexp浏览了一些示例,但我不能在输入掩码中使用“:”之类的。有人能告诉我如何实现吗?

尽管Qt文档明确表示,如果我们希望在out
QLineEdits
中进行范围控制,我们将“使用掩码和验证器”,但这似乎不是那么简单。至少其他人也有类似的问题。但这可能会有所帮助:

子类化
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
#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);
}
#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
#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();
}
#include "rootwindow.h"
#include <QApplication>

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

    return a.exec();
}
对于
MyLineEdit
对象本身,我们使用
QRegExp
只允许以12小时格式输入时间,此时不带冒号:1152,例如,当用户结束编辑时,lineedit将获得形式为
“HH:HH”
的InpuMask,即1152到11:52。焦点已清除。如果用户再次聚焦到lineedit,则会将其清除,并再次设置
QRegExp
,用户输入新时间1245,例如,依此类推

---------------------rootwindow.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
#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);
}
#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
#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();
}
#include "rootwindow.h"
#include <QApplication>

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

    return a.exec();
}
----------------------main.cpp--------------------------

#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
#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);
}
#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
#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();
}
#include "rootwindow.h"
#include <QApplication>

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

    return a.exec();
}
#包括“rootwindow.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
根窗口w;
w、 show();
返回a.exec();
}

它看起来有点过头了,但实际上它并没有那么多新代码,而且您的键盘上不需要冒号键

虽然Qt文档明确表示,如果我们希望在out
QLineEdits
中进行范围控制,我们将“使用掩码和验证器”,但这似乎并不是那么简单。至少其他人也有类似的问题。但这可能会有所帮助:

子类化
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
#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);
}
#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
#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();
}
#include "rootwindow.h"
#include <QApplication>

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

    return a.exec();
}
对于
MyLineEdit
对象本身,我们使用
QRegExp
只允许以12小时格式输入时间,此时不带冒号:1152,例如,当用户结束编辑时,lineedit将获得形式为
“HH:HH”
的InpuMask,即1152到11:52。焦点已清除。如果用户再次聚焦到lineedit,则会将其清除,并再次设置
QRegExp
,用户输入新时间1245,例如,依此类推

---------------------rootwindow.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
#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);
}
#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
#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();
}
#include "rootwindow.h"
#include <QApplication>

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

    return a.exec();
}
----------------------main.cpp--------------------------

#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
#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);
}
#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
#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();
}
#include "rootwindow.h"
#include <QApplication>

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

    return a.exec();
}
#包括“rootwindow.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
根窗口w;
w、 show();
返回a.exec();
}

它看起来有点过头了,但实际上它并没有那么多新代码,而且您的键盘上不需要冒号键

使用
QTimeEdit
怎么样?@hank不,我不能在这里使用它。要求:)如何使用
QTimeEdit
?@hank不,我不能在这里使用它。要求:)