केवल नंबर स्वीकार करने के लिए QLineEdit सेट करें


84

मेरे पास एक ऐसा स्थान है QLineEditजहां उपयोगकर्ता को केवल संख्याओं का इनपुट करना चाहिए।

तो क्या केवल नंबर के लिए ही सेटिंग है QLineEdit?

जवाबों:


135

QLineEdit::setValidator(), उदाहरण के लिए:

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

या

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

देखें: QIntValidator , QDoubleValidator , QLineEdit :: setValidator


4
क्या यह Qt डिज़ाइनर से किया जा सकता है, या यह केवल कोड के माध्यम से संभव है?
साशोअल्म

2
मेरे ज्ञान के लिए डिज़ाइनर में ऐसा करने का कोई तरीका नहीं है।
क्रिस

यह एक त्वरित समाधान है यदि आपको वैज्ञानिक संकेतन (जैसे, 3.14e-7) में दिए गए इनपुट की आवश्यकता है । QDoubleSpinBoxवैज्ञानिक अंकन में संख्या स्वीकार नहीं करता है (Qt 5.5)।
फ्रेडरिक अलुंद

अगर मैं (1,100) डालता हूं, तो यह अभी भी 0 को इनपुट के रूप में स्वीकार करेगा। इसके अलावा, मैं 0 अनिश्चित काल तक (केवल तीन बार नहीं) लिख सकता हूँ !!
मैक्लन

2
QRegExpValidator को QRegExp ("[0-9] *") के साथ भी देखें ।
user2962533

29

सबसे अच्छा है QSpinBox

और दोहरे मूल्य के उपयोग के लिए 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
भले ही ओपी एक QLineEdit के साथ काम करना चाहता है, लेकिन QSpinBox का उपयोग करना निश्चित रूप से सबसे अच्छा तरीका है।
DrHaze

2
यह तब काम करता है जब संख्या सीमा छोटी होती है। इस बारे में सोचें कि आप इस विजेट का उपयोग उम्र या आईडी के लिए करना चाहते हैं।
स्टीव

केवल नंबर कुंजियों, दशमलव विभाजक और बैकस्पेस के साथ काम करने के लिए स्पिनबॉक्स को और अधिक कीबोर्ड के अनुकूल बनाने का कोई तरीका?
मिका

13

द रेगेक्स वैलिडेटर

अब तक, अन्य उत्तर केवल एक अपेक्षाकृत के लिए समाधान प्रदान परिमित अंकों की संख्या। हालाँकि, यदि आप एक मनमाने ढंग से या अंकों की एक चर संख्या के साथ संबंध रखते हैं, तो आप एक का उपयोग कर सकते हैं QRegExpValidator, एक regex जो केवल अंकों को स्वीकार करता है (जैसा कि user2962533 की टिप्पणी के अनुसार नोट किया गया है )। यहाँ एक न्यूनतम, पूर्ण उदाहरण है:

#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();
}

QRegExpValidatorइसके लाभों पर है (और है कि केवल एक ख़ामोश है)। यह अन्य उपयोगी मान्यताओं के एक समूह के लिए अनुमति देता है:

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".     

लाइन-एडिट बिहेवियर पर अधिक

प्रलेखन के अनुसार :

ध्यान दें कि यदि लाइन एडिट पर वैलिडेटर सेट है, तो रिटर्नपार्टेड () / एडिटिंगफिनिश्ड () सिग्नल्स केवल तभी उत्सर्जित होंगे, जब वैलिडेटर QValidator लौटाता है :: स्वीकार्य।

इस प्रकार, लाइन-एडिट उपयोगकर्ता को इनपुट अंकों की अनुमति देगा भले ही न्यूनतम राशि अभी तक नहीं पहुंची हो। उदाहरण के लिए, भले ही उपयोगकर्ता ने regex "[0-9]{3,}"(जिसमें कम से कम 3 अंकों की आवश्यकता हो) के खिलाफ कोई पाठ इनपुट नहीं किया है , लाइन-एडिट अभी भी उपयोगकर्ता को उस न्यूनतम आवश्यकता तक पहुंचने के लिए इनपुट टाइप करने की अनुमति देता है । हालांकि, यदि उपयोगकर्ता "कम से कम 3 अंकों" की आवश्यकता को बताए बिना संपादन समाप्त करता है, तो इनपुट अमान्य होगा ; संकेतों returnPressed()और editingFinished()उत्सर्जित नहीं किया जाएगा।

यदि रेगेक्स में अधिकतम-बाध्य (जैसे "[0-1]{,4}") था, तो लाइन-एडिट किसी भी इनपुट को पिछले 4 वर्णों को रोक देगा। साथ ही, वर्ण सेट (यानी के लिए [0-9], [0-1], [0-9A-F], आदि) लाइन से संपादित केवल अनुमति देता से पात्रों कि विशेष सेट डाले जा सकते हैं।

ध्यान दें कि मैंने केवल Qt 5.11 के साथ एक macOS पर इसका परीक्षण किया है, अन्य Qt संस्करणों या ऑपरेटिंग सिस्टम पर नहीं। लेकिन Qt के क्रॉस-प्लेटफॉर्म स्कीमा को देखते हुए ...

डेमो: रेगेक्स वैलिडेटर्स शोकेस


8

आप यह भी सेट कर सकते हैं inputMask:

QLineEdit.setInputMask("9")

इससे उपयोगकर्ता केवल एक अंक टाइप 0कर सकता है 99उपयोगकर्ता को कई नंबरों को दर्ज करने की अनुमति देने के लिए कई का उपयोग करें । उन पात्रों की पूरी सूची भी देखें जिन्हें इनपुट मास्क में इस्तेमाल किया जा सकता है

(मेरा जवाब अजगर में है, लेकिन इसे C ++ में बदलना मुश्किल नहीं होना चाहिए)


7

आप QSpinBoxइस उद्देश्य के लिए उपयोग क्यों नहीं करते ? आप ऊपर / नीचे बटन को कोड की निम्न पंक्ति के साथ अदृश्य सेट कर सकते हैं:

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

-1

यदि आप क्यूटी क्रिएटर 5.6 का उपयोग कर रहे हैं तो आप ऐसा कर सकते हैं:

#include <QIntValidator>

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

मुझे लगता है कि आप उस लाइन को ui-> setupUi (यह) के बाद डालेंगे;

आशा है कि ये आपकी मदद करेगा।


8
आपका कंस्ट्रक्टर इनवोकेशन होना चाहिए new QIntValidator(this), अन्यथा जैसे ही आपका विजेट स्कोप के दायरे से बाहर जाएगा , वैलिडेटर ऑब्जेक्ट लीक हो जाएगा।
अलेक्जेंड्रोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.