Russian Qt Forum
Март 28, 2024, 17:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как проверить, пуста ли EditLine?  (Прочитано 7156 раз)
Hero Sanya
Новичок

Offline Offline

Сообщений: 34



Просмотр профиля
« : Май 29, 2020, 23:46 »

У меня есть поле, в которое по умолчанию записано число. Пользователь удаляет число, пока его не станет. Собственно, когда его нету, я бы хотел делать проверку, на пустое поле.
Код:
static string x;
    x=ui->lineEdit->text().toStdString();
if(x==?????)
А вообще, в случае. если у меня число в поле по умолчанию есть, а я хочу, чтобы при наведении на поле и нажатию по нему, текст исчезал, это какой сигнал?(понятно, что после этого, можно просто ui->settext(""); сделать).
Проверка нужна чтобы после этого, пользователь может ввести в поле, что нибудь ещё, передумать, стереть и написать ещё раз.
Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



Просмотр профиля
« Ответ #1 : Май 30, 2020, 01:09 »

Код:
ui->lineEdit->displayText().isEmpty()
Записан

tamplier
Новичок

Offline Offline

Сообщений: 40


Просмотр профиля
« Ответ #2 : Май 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();
 
}
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 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, часто этого достаточно.
Записан
Hero Sanya
Новичок

Offline Offline

Сообщений: 34



Просмотр профиля
« Ответ #4 : Июнь 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.
« Последнее редактирование: Июнь 12, 2020, 17:57 от Hero Sanya » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #5 : Июнь 12, 2020, 18:21 »

Мне просто нужно, когда пользователь в первый раз нажимал на это поле с него стиралось фраза "Введите название"
с этого и надо было начинать Улыбающийся это называется placeholder: https://doc.qt.io/qt-5/qlineedit.html#placeholderText-prop
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Hero Sanya
Новичок

Offline Offline

Сообщений: 34



Просмотр профиля
« Ответ #6 : Июнь 12, 2020, 21:20 »

Мне просто нужно, когда пользователь в первый раз нажимал на это поле с него стиралось фраза "Введите название"
с этого и надо было начинать Улыбающийся это называется placeholder: https://doc.qt.io/qt-5/qlineedit.html#placeholderText-prop
Так, эта штука делает текст серым и как бы не существующем. На всякий случай хочу уточнить: Если пользователь не будет менять текст в этом лайнэдите, то этот текст будет считываться как обычно(то есть как введённый текст)?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Июнь 12, 2020, 22:33 »

Нет, но ты можешь сделать проверку на пустоту и взять placeholderText. если тебе надо.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #8 : Июнь 12, 2020, 23:44 »

наверняка серый цвет можно поменять через qss
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
tamplier
Новичок

Offline Offline

Сообщений: 40


Просмотр профиля
« Ответ #9 : Июнь 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++, но за настойчивость и терпение респект  Улыбающийся
Записан
tamplier
Новичок

Offline Offline

Сообщений: 40


Просмотр профиля
« Ответ #10 : Июнь 13, 2020, 15:52 »

Либо как посоветовал kambala метод setPlaceholderText(const QString &), минимум кода будет...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июнь 14, 2020, 08:21 »

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

Думаю подробно объяснил. А, вообще, по-моему, это геморрой так программировать, не зная азы C++, но за настойчивость и терпение респект  Улыбающийся
Меньше за него переживайте  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.158 секунд. Запросов: 23.