Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Hero Sanya от Май 29, 2020, 23:46



Название: Как проверить, пуста ли EditLine?
Отправлено: Hero Sanya от Май 29, 2020, 23:46
У меня есть поле, в которое по умолчанию записано число. Пользователь удаляет число, пока его не станет. Собственно, когда его нету, я бы хотел делать проверку, на пустое поле.
Код:
static string x;
    x=ui->lineEdit->text().toStdString();
if(x==?????)
А вообще, в случае. если у меня число в поле по умолчанию есть, а я хочу, чтобы при наведении на поле и нажатию по нему, текст исчезал, это какой сигнал?(понятно, что после этого, можно просто ui->settext(""); сделать).
Проверка нужна чтобы после этого, пользователь может ввести в поле, что нибудь ещё, передумать, стереть и написать ещё раз.


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: tux от Май 30, 2020, 01:09
Код:
ui->lineEdit->displayText().isEmpty()


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: tamplier от Май 30, 2020, 05:02

А вообще, в случае. если у меня число в поле по умолчанию есть, а я хочу, чтобы при наведении на поле и нажатию по нему, текст исчезал, это какой сигнал?(понятно, что после этого, можно просто ui->settext(""); сделать).
Проверка нужна чтобы после этого, пользователь может ввести в поле, что нибудь ещё, передумать, стереть и написать ещё раз.


Это не сигнал, а слот. Сигнал просто сигнализирует о чем-то, а слот уже производит какое-то действие.Слот - void QLineEdit::clear(), а подходящего сигнала для QLineEdit нет. Поэтому самое простое перегрузить метод события. Помогут классы событий. Например класс события мыши. Можно перегрузить метод mousePressEvent(QMouseEvent *e) -  https://doc.qt.io/qt-5/qlineedit.html#mousePressEvent. Либо focusInEvent(QFocusEvent *e) - https://doc.qt.io/qt-5/qlineedit.html#focusInEvent, но в этом случае фокус элементом может быть получен, не только по нажатию мыши.

Рабочий пример:

lineed.h:
Код
C++ (Qt)
#ifndef LINEED_H
#define LINEED_H
 
#include <QtWidgets>
 
class LineEd : public QLineEdit {
 
protected:
   virtual void mousePressEvent(QMouseEvent*) {
       clear();
   }
 
public:
   LineEd(QWidget *wgt = 0) : QLineEdit(wgt) {}
 
};
 
#endif // LINEED_H
 

main.cpp:
Код
C++ (Qt)
#include <QtWidgets>
#include "lineed.h"
 
int main(int argc, char** argv) {
 
   QApplication app(argc, argv);
   QWidget      wgt;
 
   LineEd *LnEd = new LineEd;
 
   QVBoxLayout* vLayout = new QVBoxLayout;
   vLayout->addWidget(LnEd);
   wgt.setLayout(vLayout);
 
   wgt.show();
 
   return app.exec();
 
}
 


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: Igors от Май 30, 2020, 14:38
У меня есть поле, в которое по умолчанию записано число. Пользователь удаляет число, пока его не станет. Собственно, когда его нету, я бы хотел делать проверку, на пустое поле.
Код:
static string x;
    x=ui->lineEdit->text().toStdString();
if(x==?????)
А вообще, в случае. если у меня число в поле по умолчанию есть, а я хочу, чтобы при наведении на поле и нажатию по нему, текст исчезал, это какой сигнал?(понятно, что после этого, можно просто ui->settext(""); сделать).
Проверка нужна чтобы после этого, пользователь может ввести в поле, что нибудь ещё, передумать, стереть и написать ещё раз.
Проблемы с "хотелкой". См QValidator: Intermediate, Acceptable, Invalid. Условно ввод данных имеет 2 фазы

1) "Набор"данных/числа юзером. При этом на текущий момент число может быть валидно или нет. Напр валидные числа от 100 до 200, юзер (пока) нажал только единичку. Или ввел 300. Или вообще стер весь текст. Все эти значения не валидны и не могут быть записаны в данные. Но они должны отображаться в edit поле ("что нибудь ещё, передумать, стереть и написать ещё раз"). Это "intermediate". Другое дело если юзер пытается ввести букву вместо цифры, с ней текст уже никогда не станет валидным, значит и пропускать (отображать) эту букву не нужно, это "invalid".

2) "Запись" введенного числа. Здесь уже может использоваться только Acceptable текст. Если это не так, то нужно или вывалить диалог поясняющий что "так низзя", или, по крайней мере, сменить текст на изначальный (до редактирования).

Вот собсно и все. Не надо бегать все время чего-то проверять, стандартный  валидатор нормально это делает. Нужно просто определить момент записи (приемв) данных и там отстреляться. Обычно это потеря фокуса, нажатие Enter, иногда время истекшее с момента последнего ввода. Для начала неплохо подсесть на textEdited, часто этого достаточно.


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: Hero Sanya от Июнь 12, 2020, 17:33
И что этот рабочий пример делает? Насколько я понял, добавляет виджет, но судя по h файлу, виджет мышки которая может удалять.
Цитировать
Рабочий пример:

lineed.h:
Код
C++ (Qt)
#ifndef LINEED_H
#define LINEED_H
 
#include <QtWidgets>
 
class LineEd : public QLineEdit {
 
protected:
   virtual void mousePressEvent(QMouseEvent*) {
       clear();
   }
 
public:
   LineEd(QWidget *wgt = 0) : QLineEdit(wgt) {}
 
};
 
#endif // LINEED_H
 

main.cpp:
Код
C++ (Qt)
#include <QtWidgets>
#include "lineed.h"
 
int main(int argc, char** argv) {
 
   QApplication app(argc, argv);
   QWidget      wgt;
 
   LineEd *LnEd = new LineEd;
 
   QVBoxLayout* vLayout = new QVBoxLayout;
   vLayout->addWidget(LnEd);
   wgt.setLayout(vLayout);
 
   wgt.show();
 
   return app.exec();
 
}
 

Мне просто нужно, когда пользователь в первый раз нажимал на это поле с него стиралось фраза "Введите название". Естественно. я надеялся, что в момент нажатия на поле ввода, посылается сигнал. что поле стало активным, что с ним начали работать или что то в этом духе, чтобы потом слотом сделать settext(""); и всё.
Не понимаю, что даёт переопределение mouseЕvent'a.


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: kambala от Июнь 12, 2020, 18:21
Мне просто нужно, когда пользователь в первый раз нажимал на это поле с него стиралось фраза "Введите название"
с этого и надо было начинать :) это называется placeholder: https://doc.qt.io/qt-5/qlineedit.html#placeholderText-prop


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: Hero Sanya от Июнь 12, 2020, 21:20
Мне просто нужно, когда пользователь в первый раз нажимал на это поле с него стиралось фраза "Введите название"
с этого и надо было начинать :) это называется placeholder: https://doc.qt.io/qt-5/qlineedit.html#placeholderText-prop
Так, эта штука делает текст серым и как бы не существующем. На всякий случай хочу уточнить: Если пользователь не будет менять текст в этом лайнэдите, то этот текст будет считываться как обычно(то есть как введённый текст)?


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: Пантер от Июнь 12, 2020, 22:33
Нет, но ты можешь сделать проверку на пустоту и взять placeholderText. если тебе надо.


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: kambala от Июнь 12, 2020, 23:44
наверняка серый цвет можно поменять через qss


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: tamplier от Июнь 13, 2020, 15:39
И что этот рабочий пример делает? Насколько я понял, добавляет виджет, но судя по h файлу, виджет мышки которая может удалять.
Цитировать
Рабочий пример:
....


Мне просто нужно, когда пользователь в первый раз нажимал на это поле с него стиралось фраза "Введите название". Естественно. я надеялся, что в момент нажатия на поле ввода, посылается сигнал. что поле стало активным, что с ним начали работать или что то в этом духе, чтобы потом слотом сделать settext(""); и всё.
Не понимаю, что даёт переопределение mouseЕvent'a.


Если создать два файла lineed.h и main.cpp и добавить их в проект, удалив при этом лишние файлы (если они были созданы), то сразу станет понятно, что этот пример делает. Я не поленился этот пример написать, а ты не поленись сделать пару раз копипаст.

Код этого примера избыточен, main можно так написать:

main.cpp:
Код
C++ (Qt)
#include <QtWidgets>
#include "lineed.h"
 
int main(int argc, char** argv) {
 
   QApplication app(argc, argv);
 
   LineEd LnEd;
 
   LnEd.show();
 
   return app.exec();
}
 

А чтобы не удалялось всё, что написано в поле QLineEdit, можно в методе mousePressEvent() задать дополнительное условие:

lineed.h:
Код
C++ (Qt)
#ifndef LINEED_H
#define LINEED_H
 
#include <QtWidgets>
 
class LineEd : public QLineEdit {
 
protected:
   virtual void mousePressEvent(QMouseEvent*) {
     if(text() == "My Text") clear();
   }
 
public:
   LineEd(QWidget *wgt = 0) : QLineEdit(wgt) {}
 
};
 
#endif // LINEED_H
 

P.S.: поясню, в файле lineed.h происходит создание класса LineEd, наследуемого от QLineEdit. Это необходимо для того, чтобы переопределить метод mousePressEvent(), для работы с событиями мыши, а именно "клика" по полю QLineEdit. "My Text" - это текст, который будет удаляться из поля LineEd при клике по полю мышкой (другой текст удаляться не будет). Думаю подробно объяснил. А, вообще, по-моему, это геморрой так программировать, не зная азы C++, но за настойчивость и терпение респект  :)


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: tamplier от Июнь 13, 2020, 15:52
Либо как посоветовал kambala метод setPlaceholderText(const QString &), минимум кода будет...


Название: Re: Как проверить, пуста ли EditLine?
Отправлено: Igors от Июнь 14, 2020, 08:21
P.S.: поясню, в файле lineed.h происходит создание класса LineEd, наследуемого от QLineEdit. Это необходимо для того, чтобы переопределить метод mousePressEvent(), для работы с событиями мыши, а именно "клика" по полю QLineEdit. "My Text" - это текст, который будет удаляться из поля LineEd при клике по полю мышкой (другой текст удаляться не будет).
Либо как посоветовал kambala метод setPlaceholderText(const QString &), минимум кода будет...
Да, это решение выглядит лучшим. Дело даже не минимуме кода, наследование в данном случае не оправдано, слишком мал добавленный ф-ционал чтобы быть классом. Если бы штатной возможности setPlaceholderText не было - лучше было добавить ее фильтром

Думаю подробно объяснил. А, вообще, по-моему, это геморрой так программировать, не зная азы C++, но за настойчивость и терпение респект  :)
Меньше за него переживайте  :)