Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QLineEdit проверить
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
fortero
Подскажите пожалуйста ато мозг устал...
Как в виджите QLineEdit проверить что есть информация не нуливая в пределах одной области видемости, что бы потом можно было дать разришение на нажатие кнопок?
Спасибо за внимание!
Алексей1153
fortero, что значит - "нулевая информация" и что за "пределы видимости" ? :) И про какие кнопки речь?
fortero
Цитата(Алексей1153 @ 10.5.2011, 22:55) *
fortero, что значит - "нулевая информация" и что за "пределы видимости" ? :) И про какие кнопки речь?

void FormsAddEditSp::fSkAdd(){
    setMinimumSize(600, 380);
    setMaximumSize(600, 380);
    grBox = new QGroupBox(tr("Здесь вы можите добавить запись в справочник корреспандентов:"), this);
    
    nameL = new QLabel(tr("Наименование: "), this);
    descriptionL = new QLabel(tr("Полное имя: "), this);
    accountL = new QLabel(tr("Расчётный счёт: "), this);
    mfoL = new QLabel(tr("МФО: "), this);
    kodokpoL = new QLabel(tr("Код ОКПО: "), this);
    addressL = new QLabel(tr("Адрес: "), this);
    inmpL = new QLabel(tr("Регестрационный номер: "), this);
    nsvdL = new QLabel(tr("Номер свидетельства: "), this);
    phoneL = new QLabel(tr("Телефон: "), this);
    
    nameE = new QLineEdit(this);
    descriptionE = new QLineEdit(this);
    accountE = new QLineEdit(this);
    mfoE = new QLineEdit(this);
    kodokpoE = new QLineEdit(this);
    addressE = new QLineEdit(this);
    inmpE = new QLineEdit(this);
    nsvdE = new QLineEdit(this);
    phoneE = new QLineEdit(this);
    //Валидность
    nameE->setMaxLength(30);
    descriptionE->setMaxLength(255);
    addressE->setMaxLength(50);
    QRegExp evAccount(tr("[0-9]{14}"));
    accountE->setValidator(new QRegExpValidator(evAccount, this));
    QRegExp evKodokpo(tr("[0-9]{10}"));
    kodokpoE->setValidator(new QRegExpValidator(evKodokpo, this));
    QRegExp evMfoInmpNsvd(tr("[0-9]{12}"));
    mfoE->setValidator(new QRegExpValidator(evMfoInmpNsvd, this));
    inmpE->setValidator(new QRegExpValidator(evMfoInmpNsvd, this));
    nsvdE->setValidator(new QRegExpValidator(evMfoInmpNsvd, this));
    QRegExp evPhone(tr("[0-9+() -]{36}"));
    phoneE->setValidator(new QRegExpValidator(evPhone, this));
    //end
    
    btnBox = new QDialogButtonBox(Qt::Horizontal, this);
    btnBox->addButton(tr("Записать"), QDialogButtonBox::AcceptRole);
    btnBox->addButton(tr("Отмена"), QDialogButtonBox::RejectRole);

    gridLay = new QGridLayout(this);
    gridLay->setMargin(15);
    gridLay->setSpacing(10);

    gridLay->addWidget(nameL, 1, 0);
    ...
бля-бля-бля
              ....
    gridLay->addWidget(btnBox, 10, 1, 1, 2);
    
    gridLay->setColumnStretch(1, 2);
    gridLay->setRowStretch(10, 2);
    grBox->move(10, 10);
    grBox->resize(580, 360);
    grBox->setLayout(gridLay);
        
    connect(btnBox, SIGNAL(accepted()), this, SLOT(accept()));
    connect(btnBox, SIGNAL(rejected()), this, SLOT(reject()));
    
}

И другая функция:
bool FormsAddEditSp::buttonFSkAdd(){
    if(exec() == QDialog::Accepted){
        finList << nameE->text() << descriptionE->text() << accountE->text() << mfoE->text() << addressE->text() << phoneE->text() << kodokpoE->text() <<inmpE->text() << nsvdE->text();
        DbConnect *fdb = new DbConnect(this);
        fdb->insertDT(tr("firm"), tr("name,description,account,mfo,address,phone,kod_okpo,inmp,nsvd"), finList);
        delete fdb;
        QMessageBox::about(this, tr("Внимание!"), tr("Всё работает!!!"));
        return true;
        }
        return false;
}

Как сделать, что бы не добравшись до второй функции, можно было выяснить QLineEdit полные или пустые???
Алексей1153
Цитата(fortero @ 11.5.2011, 2:01) *
Как сделать, что бы не добравшись до второй функции, можно было выяснить QLineEdit полные или пустые???


наверное, проверить

if(nameE->text()=="")
{
}
fortero
Цитата(Алексей1153 @ 10.5.2011, 23:13) *
Цитата(fortero @ 11.5.2011, 2:01) *
Как сделать, что бы не добравшись до второй функции, можно было выяснить QLineEdit полные или пустые???


наверное, проверить

if(nameE->text()=="")
{
}


Так не получется, потому, что они в одной областе видемости и с самого начала поля пустые он сразу начнёт сверять... Я уже пробовал кучу подобных вариантов тут как то через сигнал слот надо действовать... Вот как только моСк спёкся за целый день!
Алексей1153
при чём тут область видимости

я так и не понял, что требуется )))
fortero
Цитата(Алексей1153 @ 10.5.2011, 23:27) *
при чём тут область видимости

я так и не понял, что требуется )))

Ну есть, форма, она пустая QLineEdit, когда в неё вводиш данные нужно что бы определяло это, а если это описать в этой функции он автоматом думает что она пустая она же не обновляется...
breeve
Цитата(fortero @ 11.5.2011, 2:22) *
Ну есть, форма, она пустая QLineEdit, когда в неё вводиш данные нужно что бы определяло это, а если это описать в этой функции он автоматом думает что она пустая она же не обновляется...

Ты можешь подключить сигнал QLineEdit::textChanged(QString), QLineEdit::textEdited(QString) или QLineEdit::editFinished()
к своему слоту и там уже обрабатывать то что тебе надо.
И сигнал будет посылаться не сразу при запуске, а когда юзер что-то сделает во время работы.
fortero
Цитата(breeve @ 11.5.2011, 1:31) *
Цитата(fortero @ 11.5.2011, 2:22) *
Ну есть, форма, она пустая QLineEdit, когда в неё вводиш данные нужно что бы определяло это, а если это описать в этой функции он автоматом думает что она пустая она же не обновляется...

Ты можешь подключить сигнал QLineEdit::textChanged(QString), QLineEdit::textEdited(QString) или QLineEdit::editFinished()
к своему слоту и там уже обрабатывать то что тебе надо.

Я уже думал об этом, но нужно не только изминение отследить но и ч то бы оно не пустым осталось!
breeve
Цитата(fortero @ 11.5.2011, 2:32) *
Я уже думал об этом, но нужно не только изминение отследить но и ч то бы оно не пустым осталось!

Если я тебя правильно понял, то ты в этом слоте делай обработку т.о. если строка пустая заблокировать кнопку, если нет то разблокировать.
Ну и изначально блокируешь кнопку, чтобы пользователь в любом случае что-нибудь ввел.
fortero
Цитата(breeve @ 11.5.2011, 1:37) *
Цитата(fortero @ 11.5.2011, 2:32) *
Я уже думал об этом, но нужно не только изминение отследить но и ч то бы оно не пустым осталось!

Если я тебя правильно понял, то ты в этом слоте делай обработку т.о. если строка пустая заблокировать кнопку, если нет то разблокировать.
Ну и изначально блокируешь кнопку, чтобы пользователь в любом случае что-нибудь ввел.

Верно Вы понимаете, вот я набросал пример, отбросив лишенее:
#include <QtGui>

int main(int argc, char **argv){
    QApplication app(argc, argv);
    QDialog dia;
    QLineEdit ed;
    QHBoxLayout lay;
    QPushButton btn("OK");
    btn.setDisabled(true);
    if() //Вставить услове которое разблокирует кнопку ????????
    btn.setDisabled(false);
    lay.addWidget(&ed, 1);
    lay.addWidget(&btn);
    dia.setLayout(&lay);
    dia.resize(250, 40);
    dia.show();
    return app.exec();
}
breeve
Или можешь сделать просто флаг - переменную bool isEmpty. Которая изначально будет тру(строка пустая). И при любом изменении текста LineEdit'а будет проверяться пустая ли строка. А как это сделать читай выше. Сигнал к слоту, и в нем обрабатываешь и изменяешь переменную.

Пример твой не прокатит, насколько я знаю чтобы сделать слот нужно в любом случае класс создавать свой.
Проверенный код:
BLOCKBUTTON_H
#ifndef BLOCKBUTTON_H
#define BLOCKBUTTON_H

#include <QtGui>

class BlockButton : public QWidget
{
    Q_OBJECT

public:
    BlockButton(QWidget *parent = 0);
    ~BlockButton(){};
private:
    QPushButton *button;
    QLineEdit *line;
    QVBoxLayout *vLay;
private slots:
    void s_blockButton(QString);
};

#endif // BLOCKBUTTON_H
BLOCKBUTTON.CPP
#include "blockbutton.h"

BlockButton::BlockButton(QWidget *parent)
    : QWidget(parent)
{
    vLay = new QVBoxLayout;
    button = new QPushButton("Next");
    button->setDisabled(true);
    line= new QLineEdit;
    connect(line, SIGNAL(textChanged(QString)),
            this, SLOT(s_blockButton(QString)));


    vLay->addWidget(line);
    vLay->addWidget(button);
    setLayout(vLay);
}

void BlockButton::s_blockButton(QString s)
{
    if(s.isEmpty())
        button->setDisabled(true);
    else
        button->setDisabled(false);
}
fortero
Спасибо помогло, пару маленьких поправок и всё стало так как я хочу!
Но вот снова не задача, а как быть когда надо обслуживать несколько поолей, если в 3 из 9 полей нет данных то кнопка не должна быть активная, как это орагнизовать???
MJIbIu
Цитата(fortero @ 11.5.2011, 4:43) *
Спасибо помогло, пару маленьких поправок и всё стало так как я хочу!
Но вот снова не задача, а как быть когда надо обслуживать несколько поолей, если в 3 из 9 полей нет данных то кнопка не должна быть активная, как это орагнизовать???

Может быть есть есть и другие способы, но в лоп приходит тока мысль создать массив из bool переменных. При каждом вводе заполнять его, не пустое или пустое. потом его проверять на все true.
breeve
Цитата(fortero @ 11.5.2011, 4:43) *
Спасибо помогло, пару маленьких поправок и всё стало так как я хочу!
Но вот снова не задача, а как быть когда надо обслуживать несколько поолей, если в 3 из 9 полей нет данных то кнопка не должна быть активная, как это орагнизовать???

Подключаешь сигналы textChanged(QString), от трех LineEdit'ов к одному слоту и там обрабатываешь.
Слот выглядит примерно так:
void BlockButton::s_blockButton()
{
    bool first = lineOne->text().isEmpty();
    bool second = lineTwo->text().isEmpty();
    bool third = lineThree->text().isEmpty();
    if(first || second || third)
         button->setDisabled(true);
    else
         button->setDisabled(false);
}
fortero
Всем оргрмное спасибо!
Всё работает так как я и представлял!

P.S. А подскажите а какой функцией можно измереть длинну строки, в классе QString?
silver47
Цитата(fortero @ 13.5.2011, 3:43) *
А подскажите а какой функцией можно измереть длинну строки, в классе QString?


int QString::size () const
Returns the number of characters in this string.
The last character in the string is at position size() - 1. In addition, QString ensures that the character at position size() is always '\0', so that you can use the return value of data() and constData() as arguments to functions that expect '\0'-terminated strings.

Все что курсивом для общего развития. Существуют так называемые C-строки и Pascal-строки. Первые произвольной длинны, последний символ - \0, счет ведется с нулевого символа. Вторые длинной до 255 символов, счет ведется с 1 символа, т.к. нулевой содержит длину строки (один байт).
Litkevich Yuriy
Цитата(fortero @ 11.5.2011, 2:01) *
выяснить QLineEdit полные или пустые???
QLineEdit::text() + QString::isEmpty()
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.