• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program z QValidator

Object Storage Arubacloud
0 głosów
123 wizyt
pytanie zadane 13 sierpnia 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)
//klasa Widget//

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    QLineEdit* edit;

public slots:
    void onReturnPressed();

};
//////////////////////////////////////
//konstruktor QWidget//
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{

    edit = new QLineEdit(this);
    connect(edit,SIGNAL(returnPressed()),this,SLOT(onReturnPressed()));
}
//////////////////////////////////////////////////////////

//klasa dziedzicząca od QValidator///

#include <QObject>
#include <QValidator>
#include <QRegExp>
#include <QRegExpValidator>
#define CORRECT_NUMBER "ISBN\\x20(?=.{13}$)\\d{1,5}" \
                       "([- ])\\d{1,7}\\1\\d{1,6}\\1(\\d|X)$"

class MyValidator : public QValidator
{
    Q_OBJECT
public:
    explicit MyValidator(QObject *parent = nullptr);
    QValidator::State validate(QString & text, int &) const
    {
        QRegExp regEx(CORRECT_NUMBER);
        QRegExpValidator validator(regEx);
        bool solution = regEx.exactMatch(text);
        if(solution)
            return QValidator::Acceptable;
        else
            return QValidator::Invalid;
    }
};
////////////////////////////////////////
//slot "onReturnPressed"
void Widget::onReturnPressed()
{
    MyValidator *valid;
    valid = new MyValidator;
    QString text = edit->text();
    int zero = 0;
    auto solution = valid->validate(text,zero);
    if(solution == QValidator::Acceptable)
    {
        QMessageBox::information(this,"Congrats","Number is valid",QMessageBox::Ok);
    }
}
//////////////////////////////////
//main()

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}


Cześć, robię program z QValidator, ma on wyświetlić komunikat, jeżeli podany numer jest poprawnym numerem ISBN. Powyższy kod niestety nie działa :( . Jak mogę go poprawić?

2 odpowiedzi

+1 głos
odpowiedź 13 sierpnia 2019 przez Bondrusiek Maniak (61,370 p.)

Witam,

spróbuj podać w funkcji onReturnPressed():

edit->setValidator(valid);

 

0 głosów
odpowiedź 13 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)

Testowałeś to wyrażenie regularne?
Zupełnie go nie mogę zrozumieć.
Podejrzałem jak wyglądają kody ISBN i wykombinowałem coś takiego:

(ISBN(-13)?(:)? )(97[89])([- ])?\\d{1,5}([- ])?\\d{1,7}([- ])?\\d{1,6}([- ])?\\d

 

komentarz 13 sierpnia 2019 przez adrian17 Ekspert (344,860 p.)
BTW, z C++owymi raw stringami nie trzeba pisać podwójnych \\, co czyni regex znacznie czytelniejszym.
komentarz 13 sierpnia 2019 przez amelia.cpp Obywatel (1,860 p.)

@tangarr, skopiowałam do programu twoje wyrażenie i np. kod: 1-12345-1234 jest niepoprawny :(

#define CORRECT_NUMBER "(ISBN(-13)?(:)? )(97[89])([- ])?\\d{1,5}([- ])?\\d{1,7}([- ])?\\d{1,6}([- ])?\\d"

//// dalej w onReturnClicked////////

    if(solution == QValidator::Acceptable)
    {
        QMessageBox::information(this,"Congrats","Number is valid",QMessageBox::Ok);
    }
    else if(solution == QValidator::Invalid)
        QMessageBox::critical(this,"Error","Number is not valid",QMessageBox::Ok);

 

komentarz 13 sierpnia 2019 przez adrian17 Ekspert (344,860 p.)
(Bo na oko to regex na ISBN-13, a Ty masz ISBN-10.)
komentarz 13 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)

Żeby dodać obsługę ISBN 10 trzeba troszkę rozwinąć wyrażenie
Po pierwsze początek robimy opcjonalnym

((ISBN(-13)?(:)? )(97[89])([- ])?)?

Dodajemy też opcjonalny nagłówek ISBN 10

((ISBN(-10)?(:)? )?

 je łączymy

((ISBN(-10)?(:)? )|(ISBN(-13)?(:)? )(97[89])([- ])?))?

Ostatecznie wychodzi mniej więcej coś takiego

((ISBN(-10)?(:)? )|(ISBN(-13)?(:)? )(97[89])([- ])?))?\\d{1,5}([- ])?\\d{1,7}([- ])?\\d{1,6}([- ])?\\d

Nie testowałem. To tylko idea jak to powinno wyglądać.

komentarz 13 sierpnia 2019 przez amelia.cpp Obywatel (1,860 p.)

Uprościłam troche format numerów i mam coś takiego

#define CORRECT_NUMBER "[0-9]\-[0-9][0-9][0-9][0-9][0-9]\-[0-9][0-9][0-9][0-9]" 
//good for demo

Można uznać, że działa ;) Dzięki wszystkim za pomoc

Podobne pytania

0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 12 sierpnia 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)
0 głosów
1 odpowiedź 1,035 wizyt
pytanie zadane 26 sierpnia 2015 w C i C++ przez Jakub Nowacki Początkujący (470 p.)
0 głosów
1 odpowiedź 167 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...