Tôi có một QLineEdit
nơ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:
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
3.14e-7
:). QDoubleSpinBox
không chấp nhận các con số trong ký hiệu khoa học (Qt 5.5).
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)));
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 QRegExpValidator
có 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()
và 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 ...
Bạn cũng có thể đặt inputMask
:
QLineEdit.setInputMask("9")
Điều này cho phép người dùng chỉ nhập một chữ số từ 0
đến 9
. Sử dụng nhiều 9
để cho phép người dùng nhập nhiều số. Cũng xem danh sách đầy đủ các ký tự có thể được sử dụng trong dấu hiệu nhập .
(Câu trả lời của tôi là bằng Python, nhưng không khó để chuyển nó sang C ++)
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.
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.