2016-03-30 12 views
1

私はユーザーが12時間形式で入力する必要がある行の編集があります。これはタッチベースのアプリケーションで、私自身のキーボードを持っており、このキーボードには":"(コロン)文字はありません。だから、私はその目的のために入力マスクを使用しています。しかし、私は1235の形式にユーザーを制限しなければならないのに対し、ユーザーに任意の数字を入力させることができるだけsetInputMask(99:99)オプションがあります。QtのQLineEditにsetValidator()とsetInputMask()を使用するには?

私はQRegexpでいくつかの例を調べましたが、「入力マスク」のように「:」を使用できませんでした。誰も実装方法について私に指摘できますか?

+0

'QTimeEdit'はどうしますか? – hank

+0

@ hankいいえここでは使用できません。要件: –

答えて

-1

解決方法の1つは、QLineEditのinstallFilterです。その後、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は、1152から11:52までを作成する"HH:HH"という形式のInpuMaskを取得します。フォーカスがクリアされます。ユーザが再びラインディジットに焦点を合わせると、それはクリアされ、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(); 
} 

実際には少し上に見えますが実際はそれほど新しいコードではなく、キーボードにコロンキーは必要ありません。

関連する問題