Đặt QLineEdit để chỉ chấp nhận các số


83

Tôi có một QLineEditnơi mà người dùng chỉ nên nhập số.

Vì vậy, có một cài đặt chỉ số cho QLineEdit?

Câu trả lời:


135

QLineEdit::setValidator(), ví dụ:

myLineEdit->setValidator( new QIntValidator(0, 100, this) );

hoặc là

myLineEdit->setValidator( new QDoubleValidator(0, 100, 2, this) );

Xem: QIntValidator , QDoubleValidator , QLineEdit :: setValidator


4
Điều này có thể được thực hiện từ Qt Designer hay chỉ thông qua mã?
sashoalm

2
Theo hiểu biết của tôi, không có cách nào để làm điều này trong nhà thiết kế.
Chris

Đây là một giải pháp nhanh chóng nếu bạn cần đầu vào bằng ký hiệu khoa học (ví dụ 3.14e-7:). QDoubleSpinBoxkhông chấp nhận các con số trong ký hiệu khoa học (Qt 5.5).
Frederik Aalund

Nếu tôi đặt (1.100), nó sẽ vẫn chấp nhận 0 làm đầu vào. Ngoài ra, tôi có thể viết số 0 vô thời hạn (không chỉ ba lần) !!
McLan

2
Xem thêm QRegExpValidator với QRegExp ("[0-9] *").
dùng2962533

28

Tốt nhất là QSpinBox.

Và cho một giá trị sử dụng gấp đôi QDoubleSpinBox.

QSpinBox myInt;
myInt.setMinimum(-5);
myInt.setMaximum(5);
myInt.setSingleStep(1);// Will increment the current value with 1 (if you use up arrow key) (if you use down arrow key => -1)
myInt.setValue(2);// Default/begining value
myInt.value();// Get the current value
//connect(&myInt, SIGNAL(valueChanged(int)), this, SLOT(myValueChanged(int)));

2
Ngay cả khi OP muốn làm việc với QLineEdit, sử dụng QSpinBox chắc chắn là cách tốt nhất.
DrHaze

2
Điều này hoạt động khi phạm vi số nhỏ. Hãy nghĩ về việc bạn có thể muốn sử dụng tiện ích này cho độ tuổi hoặc id.
Steve

bất kỳ cách nào để làm cho bàn phím spinbox thân thiện hơn để chỉ hoạt động với các phím số, dấu phân cách thập phân và dấu cách xóa lùi?
Micka

11

Trình xác thực Regex

Cho đến nay, các câu trả lời khác chỉ cung cấp lời giải cho một số tương đối hữu hạn các chữ số. Tuy nhiên, nếu bạn lo lắng với một số lượng chữ số tùy ý hoặc một số thay đổi, bạn có thể sử dụng a QRegExpValidator, chuyển một regex chỉ chấp nhận các chữ số (như đã lưu ý trong nhận xét của user2962533 ). Đây là một ví dụ tối thiểu, đầy đủ:

#include <QApplication>
#include <QLineEdit>
#include <QRegExpValidator>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QLineEdit le;
    le.setValidator(new QRegExpValidator(QRegExp("[0-9]*"), &le));
    le.show();

    return app.exec();
}

Cái QRegExpValidatorcó giá trị của nó (và đó chỉ là cách nói ngắn gọn). Nó cho phép một loạt các xác nhận hữu ích khác:

QRegExp("[1-9][0-9]*")    //  leading digit must be 1 to 9 (prevents leading zeroes).
QRegExp("\\d*")           //  allows matching for unicode digits (e.g. for 
                          //    Arabic-Indic numerals such as ٤٥٦).
QRegExp("[0-9]+")         //  input must have at least 1 digit.
QRegExp("[0-9]{8,32}")    //  input must be between 8 to 32 digits (e.g. for some basic
                          //    password/special-code checks).
QRegExp("[0-1]{,4}")      //  matches at most four 0s and 1s.
QRegExp("0x[0-9a-fA-F]")  //  matches a hexadecimal number with one hex digit.
QRegExp("[0-9]{13}")      //  matches exactly 13 digits (e.g. perhaps for ISBN?).
QRegExp("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}")
                          //  matches a format similar to an ip address.
                          //    N.B. invalid addresses can still be entered: "999.999.999.999".     

Thêm hành vi chỉnh sửa dòng

Theo tài liệu :

Lưu ý rằng nếu có một trình xác thực được đặt trên bản chỉnh sửa dòng, thì các tín hiệu returnPressed () / editFinishing () sẽ chỉ được phát ra nếu trình xác nhận trả về QValidator :: Acceptable.

Do đó, chỉnh sửa dòng sẽ cho phép người dùng nhập các chữ số ngay cả khi chưa đạt đến số tiền tối thiểu. Ví dụ: ngay cả khi người dùng chưa nhập bất kỳ văn bản nào vào regex "[0-9]{3,}"(yêu cầu ít nhất 3 chữ số), chỉnh sửa dòng vẫn cho phép người dùng nhập đầu vào để đạt được yêu cầu tối thiểu đó. Tuy nhiên, nếu người dùng hoàn thành việc chỉnh sửa mà không xác định yêu cầu "ít nhất 3 chữ số", đầu vào sẽ không hợp lệ ; tín hiệu returnPressed()editingFinished()sẽ không được phát ra.

Nếu regex có giới hạn tối đa (ví dụ "[0-1]{,4}"), thì chỉnh sửa dòng sẽ dừng bất kỳ đầu vào nào quá 4 ký tự. Ngoài ra, đối với các bộ ký tự (ví dụ [0-9], [0-1], [0-9A-F], vv) dòng-chỉnh sửa chỉ cho phép các nhân vật trong đó tập hợp cụ thể để được nhập.

Lưu ý rằng tôi chỉ thử nghiệm điều này với Qt 5.11 trên macOS, không phải trên các phiên bản Qt hoặc hệ điều hành khác. Nhưng với lược đồ đa nền tảng của Qt ...

Demo: Regex Validators Showcase



7

Tại sao bạn không sử dụng một QSpinBoxcho mục đích này? Bạn có thể đặt nút lên / xuống ở chế độ ẩn bằng dòng mã sau:

// ...
QSpinBox* spinBox = new QSpinBox( this );
spinBox->setButtonSymbols( QAbstractSpinBox::NoButtons ); // After this it looks just like a QLineEdit.
//...

-1

Nếu bạn đang sử dụng QT Creator 5.6, bạn có thể làm như sau:

#include <QIntValidator>

ui->myLineEditName->setValidator( new QIntValidator);

Tôi khuyên bạn nên đặt dòng đó sau ui-> setupUi (this);

Tôi hi vọng cái này giúp được.


8
Lời gọi phương thức khởi tạo của bạn nên là new QIntValidator(this), nếu không, đối tượng trình xác nhận sẽ bị rò rỉ ngay khi tiện ích con của bạn vượt ra ngoài phạm vi.
Alexandros
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.