PDA

View Full Version : مبتدی: اعمال محدودیت به ورودی line edit



ehsan_faal
جمعه 26 تیر 1394, 07:06 صبح
سلام.
من میخوام با استفاده از QValidator بتونم رنج اعدادی که قراره به Line Edit وارد کنم رو کنترل کنم.
این کد رو واسش نوشتم ولی میخوام که اگه کاربر چیزی غیر از این وارد کرد تایپ نشه، باید چیکار کنم؟

QRegExp rx("^(([2-9](([.][0-9]([0-9]|))|))|(1[0-1](([.][0-9]([0-9]|))|))|(12(([.][0]{1,2})|)))$");
QValidator validate(QRegExpValidator(rx,this));
ui->txt->setValidator(validate);

این رجکس اعداد از 2.00 تا خود 12 رو چک میکنه.

chikar
جمعه 26 تیر 1394, 12:19 عصر
سلام، کلاس QValidator یک abstract class هست و شما نمونه معمولی نمی تونید از اون بسازید،به صورت زیر عمل کنید:


QValidator *v = new QRegExpValidator(QRegExp("^(([2-9](([.][0-9]([0-9]|))|))|(1[0-1](([.][0-9]([0-9]|))|))|(12(([.][0]{1,2})|)))$"));
ui->lineEdit->setValidator(v);

ehsan_faal
جمعه 26 تیر 1394, 12:25 عصر
اوپس.
اینو ندیده بودم.
من سیگنال textEdited رو دادم به یه اسلات که اگه ورودی ok نبود یه هشداری بده ولی الان یه مشکل جدیدم اینه که مثلا اگه بخوام بزنم 11 اولین یک رو که وارد میکنم هشداره میاد.
یه سیگنال دیگه هم داره به اسم editingFinished که این یکی تا وقتی اینتر نزنم یا فوکوس از دست نره امیت نمیشه. به نظر خوب میاد ولی شرط امیت شدنش اینه که حتما Qvalidator قبولش کنه پس با این حساب نمیتونم ازش استفاده کنم.باید چیکار کنم؟



#include "configtab.h"
#include "ui_configtab.h"
#include <QDoubleValidator>
#include <QToolTip>
#include <QDebug>
ConfigTab::ConfigTab(QWidget *parent) :
QWidget(parent),
ui(new Ui::ConfigTab)
{
ui->setupUi(this);
setupLineEdits();
WireLineEdits();
}

ConfigTab::~ConfigTab()
{
delete ui;
}
void ConfigTab::setupLineEdits(void)
{
ui->edtLowerFreq->setValidator(new QDoubleValidator(2.0,12.0,2,ui->edtLowerFreq));
ui->edtUpperFreq->setValidator(new QDoubleValidator(5.0,25.0,2,ui->edtUpperFreq));
}
void ConfigTab::WireLineEdits(void)
{
connect(ui->edtLowerFreq,&QLineEdit::textEdited,this,&ConfigTab::VerifyInput);
connect(ui->edtUpperFreq,&QLineEdit::textEdited,this,&ConfigTab::VerifyInput);
// connect(ui->edtLowerFreq,&QLineEdit::editingFinished,this,&ConfigTab::VerifyInput);
// connect(ui->edtUpperFreq,&QLineEdit::editingFinished,this,&ConfigTab::VerifyInput);
}
void ConfigTab::VerifyInput(void)
{
auto Obj=qobject_cast<QLineEdit*>(sender());
if(Obj->hasAcceptableInput()==false){
qDebug()<<"False";
QToolTip::showText(Obj->mapToGlobal(QPoint(0,15)),"Wrong Input",Obj);
}else if(Obj->hasAcceptableInput()==true){
qDebug()<<"True";
}
}

chikar
جمعه 26 تیر 1394, 14:30 عصر
من سیگنال textEdited رو دادم به یه اسلات که اگه ورودی ok نبود یه هشداری بده



آخه اگه ورودی ok نباشه که اصلا در lineEdit شما قرار نمی گیره و کیبورد قفل می شه! فقط کلید هایی در کیبورد کار می کنند و در lineEdit شما اعمال می شن که متناسب با عبارت منظم شما باشن!
اگر هم خیلی علاقه دارید، که تک تک کاراکتر هایی که کاربر می زنه رو چک کنید، در eventFilter می تونید از QKeyEvent استفاده کنید و دکمه کلیک شده کاربر رو با عبارت منظمتون از طریق متد exactMatch از کلاس QRegExp بررسی کنید!