Russian Qt Forum

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



Название: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Hero Sanya от Май 20, 2020, 13:50
У меня в программе куча полей qLineEdit.
У каждого поля, мне нужно перейти к слоту от изменения текста в них.
Но так как полей много, очень много, чтобы не писать кучу однотипных методов, я просто создаю один единственный слот для обработки всех полей, которые будут обрабатывать сигналы изменения текста.
Проблема заключается в том, что я не знаю что вставлять в качестве объекта обращения ui(на скриншоте это obj), т. е. мне нужно, чтобы то поле, что посылает сигнал, и обрабатывалось(я же не смогу изменить название поля в программе, когда она запущена).

Вместо obj, должно стоять название поля qLineEdit, от которого идёт сигнал по идеи. Или sender возвращает что то другое(Я думаю, что он возвращает имя того, кто посылает сигнал)?


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Пантер от Май 20, 2020, 13:58
ui-> убери, сделай

obj->text().toDouble(&ok);


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Hero Sanya от Май 20, 2020, 14:00
ui-> убери, сделай

obj->text().toDouble(&ok);

Тогда обработка не происходит. Да, компиляция проходит, но ограничения на поля, из метода, не срабатывают(там если что, ограничения для ввода в поля до вещественных чисел).


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Пантер от Май 20, 2020, 14:18
Попробуй другой сигнал, там что-то было типа textEdited или вроде того.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: ViTech от Май 20, 2020, 15:51
... (там если что, ограничения для ввода в поля до вещественных чисел).

Если что, то для ограничения ввода в QLineEdit можно использовать QValidator (https://doc.qt.io/qt-5/qvalidator.html).


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Пантер от Май 20, 2020, 16:02
А можно QDoubleSpinBox :)


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Hero Sanya от Май 20, 2020, 16:04
Попробуй другой сигнал, там что-то было типа textEdited или вроде того.
Даже так не срабатывает. Да и потом, если я вместо obj пишу конкретное поле(например lineEdit_1), то всё нормально, функция делает что должна.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Hero Sanya от Май 20, 2020, 16:05
... (там если что, ограничения для ввода в поля до вещественных чисел).

Если что, то для ограничения ввода в QLineEdit можно использовать QValidator (https://doc.qt.io/qt-5/qvalidator.html).
Да, я знаю, просто потом планируются необычные ограничения для полей, какие конкретно не знаю, поэтому через него не получится.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Пантер от Май 20, 2020, 16:09
Перепроверяй, ты что-то делаешь не так. Сделай вывод в консоль через qDebug того, что тебе прилетает в функцию.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: kambala от Май 20, 2020, 17:02
если я вместо obj пишу конкретное поле(например lineEdit_1)
на картинке используются не такие простые названия переменных, там всякие Lyner_1_1, может в этом и дело?

и кстати вставлять код текстом куда лучше.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Hero Sanya от Май 20, 2020, 19:25
если я вместо obj пишу конкретное поле(например lineEdit_1)
на картинке используются не такие простые названия переменных, там всякие Lyner_1_1, может в этом и дело?

и кстати вставлять код текстом куда лучше.
Нет, не в этом. Дело в том, что мы не обращаемся к ui, то есть к графическому интерфейсу. Нужно обратится к ui, от него обратится к конкретному объекту и сделать конкретное дело. В моём случае, я не могу обратится к конкретному объекту, мне нужно чтобы программа сама поняла к какому объекту ей нужно обратится.Я не знаю как ей это дать понять. Я читал документацию и нашёл какой то sender, который по описанию вроде как именно это и делает. Узнал как его использовать. Однако полученный объект не пропускает компилятор. Здесь мне уже успели подсказать. что можно убрать ui. Теперь я понял, что в таком случае, мы будем применять изменения к объекту, которая переменная, а не поле в программе. Такое компилятор пропускает, но такой код не имеет смысла. Вот в чём проблема.
То есть, программа сама должна узнавать, какое поле кинуло сигнал.Для этого я кинул скрин с сигналами, может я не правильно отправляю сигнал, или может сендер не так использую.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: kambala от Май 20, 2020, 20:10
по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте :)


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Hero Sanya от Май 21, 2020, 00:42
по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте :(
Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле.

В любом случае, я бы хотел знать, правильно ли я конекты записал(вначале он берёт поле, отслеживая с него сигнал о изменении, в (this), отправляя обрабатывать в слот(block_symbols_in_polya()). Отладчик кстати показал, что у меня тупо не входит в метод (block_symbols_in_polya(). Там не меняются переменные. Единственная причина, это неправильно написанный сендер или инициализация указателя, ну или, он вообще один раз слушает сигналы, сразу на старте программы и забывает про них.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Пантер от Май 21, 2020, 07:29
У тебя что-то не так где-то в другом месте. Я тебе предлагаю создать новый проект, попытаться там воспроизвести эту проблему, приложить проект сюда, а мы посмотрим и подкорректируем тебя.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: tamplier от Май 21, 2020, 08:11
У меня в программе куча полей qLineEdit.
У каждого поля, мне нужно перейти к слоту от изменения текста в них.
Но так как полей много, очень много, чтобы не писать кучу однотипных методов, я просто создаю один единственный слот для обработки всех полей, которые будут обрабатывать сигналы изменения текста.
Проблема заключается в том, что я не знаю что вставлять в качестве объекта обращения ui(на скриншоте это obj), т. е. мне нужно, чтобы то поле, что посылает сигнал, и обрабатывалось(я же не смогу изменить название поля в программе, когда она запущена).

Вместо obj, должно стоять название поля qLineEdit, от которого идёт сигнал по идеи. Или sender возвращает что то другое(Я думаю, что он возвращает имя того, кто посылает сигнал)?

Создаешь свой класс и наследуешь его от QLineEdit. И в этом классе можно определить слот и "приконнектить" его к нужному сигналу (этого же класса). Я бы так делал.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: tamplier от Май 21, 2020, 08:34
Вот что-то вроде этого (небольшой полностью рабочий пример). Только я формы не дизайнером сделал. Надеюсь поможет.

myline.h:
Код
C++ (Qt)
#ifndef MYLINE_H
#define MYLINE_H
 
#include <QLineEdit>
 
class MyLine : public QLineEdit {
 
Q_OBJECT
public:
explicit MyLine(QWidget *parent = 0);
 
signals:
 
public slots:
void MySlot(const QString &strToDouble);
 
};
 
#endif // MYLINE_H
 


myline.cpp:
Код
C++ (Qt)
#include <QDebug>
#include <QRegularExpression>
#include "myline.h"
 
MyLine::MyLine(QWidget *parent) : QLineEdit(parent) {
 
connect(this, SIGNAL(textChanged(const QString &)), SLOT(MySlot(const QString &)));
 
}
 
void MyLine::MySlot(const QString &strToDouble) {
QRegularExpression rxpComplex("^\\d+(\\.\\d+)?$");
 
QString str = strToDouble;
if(!str.contains(rxpComplex)) qDebug() << sender()->objectName()
                                      + " - value " + str + " is not double!";
 
}
 

mywidget.h:
Код
C++ (Qt)
#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
 
class MyWidget : public QWidget {
Q_OBJECT
 
public:
MyWidget(QWidget *parent = 0);
 
virtual ~MyWidget();
};
 
#endif // MYWIDGET_H
 

mywidget.cpp:
Код
C++ (Qt)
#include <QtWidgets>
#include "mywidget.h"
#include "myline.h"
 
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
MyLine *line1 = new MyLine;
line1->setObjectName("line1");
MyLine *line2 = new MyLine;
line2->setObjectName("line2");
MyLine *line3 = new MyLine;
line3->setObjectName("line3");
 
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(line1);
vbox->addWidget(line2);
vbox->addWidget(line3);
setLayout(vbox);
}
 

main.cpp:
Код
C++ (Qt)
#include <QApplication>
#include "mywidget.h"
 
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
 
return a.exec();
}
 


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Пантер от Май 21, 2020, 08:52
В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: tamplier от Май 21, 2020, 09:28
В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.

Сделал как смог. Сам еще новичок в Qt-программировании. Но, хоть какой-то рабочий пример, который отвечает на вопрос топикстартера. Просто зачастую, советы а-ля: "Ты делаешь совершенно неправильно" и "Гугл в помощь.", совершенно не помогают...


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Пантер от Май 21, 2020, 09:30
В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.

Сделал как смог. Сам еще новичок в Qt-программировании. Но, хоть какой-то рабочий пример, который отвечает на вопрос топикстартера. Просто зачастую, советы а-ля: "Ты делаешь совершенно неправильно" и "Гугл в помощь.", совершенно не помогают...
Тот код, который привел топикстартер, вполне рабочий, значит проблема где-то в другом месте. Не думаю, что твой пример ему поможет. :D Но я ни в коем случае не говорю, что ты сделал что-то неправильно, иногда переопределение классов виджетов может быть оправдано.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Mikhail от Май 21, 2020, 09:39
по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте :(
Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле.

В любом случае, я бы хотел знать, правильно ли я конекты записал(вначале он берёт поле, отслеживая с него сигнал о изменении, в (this), отправляя обрабатывать в слот(block_symbols_in_polya()). Отладчик кстати показал, что у меня тупо не входит в метод (block_symbols_in_polya(). Там не меняются переменные. Единственная причина, это неправильно написанный сендер или инициализация указателя, ну или, он вообще один раз слушает сигналы, сразу на старте программы и забывает про них.

Неправильный connect

[signal] void QLineEdit::textChanged(const QString &text)

Нет сигнала QLineEdit::textChanged() без параметров, поэтому нет входа в слот по connect


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: tamplier от Май 21, 2020, 09:43
В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.

Сделал как смог. Сам еще новичок в Qt-программировании. Но, хоть какой-то рабочий пример, который отвечает на вопрос топикстартера. Просто зачастую, советы а-ля: "Ты делаешь совершенно неправильно" и "Гугл в помощь.", совершенно не помогают...
Тот код, который привел топикстартер, вполне рабочий, значит проблема где-то в другом месте. Не думаю, что твой пример ему поможет. :D Но я ни в коем случае не говорю, что ты сделал что-то неправильно, иногда переопределение классов виджетов может быть оправдано.

К сожалению код топикстартера не проверял... Но мне показалось не очень корректным, что он создал кучу коннектов, а если "куча полей" пополнится еще парочкой, то придется писать дополнительные коннекты... Вот и привел пример, исключающий эту проблему. На истину в последней инстанции не претендую  :)


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: tamplier от Май 21, 2020, 09:47
по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте :(
Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле.

В любом случае, я бы хотел знать, правильно ли я конекты записал(вначале он берёт поле, отслеживая с него сигнал о изменении, в (this), отправляя обрабатывать в слот(block_symbols_in_polya()). Отладчик кстати показал, что у меня тупо не входит в метод (block_symbols_in_polya(). Там не меняются переменные. Единственная причина, это неправильно написанный сендер или инициализация указателя, ну или, он вообще один раз слушает сигналы, сразу на старте программы и забывает про них.

Неправильный connect

[signal] void QLineEdit::textChanged(const QString &text)

Нет сигнала QLineEdit::textChanged() без параметров, поэтому нет входа в слот по connect

Извиняюсь за оффтоп: Это лучший совет! )


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Пантер от Май 21, 2020, 10:02
по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте :(
Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле.

В любом случае, я бы хотел знать, правильно ли я конекты записал(вначале он берёт поле, отслеживая с него сигнал о изменении, в (this), отправляя обрабатывать в слот(block_symbols_in_polya()). Отладчик кстати показал, что у меня тупо не входит в метод (block_symbols_in_polya(). Там не меняются переменные. Единственная причина, это неправильно написанный сендер или инициализация указателя, ну или, он вообще один раз слушает сигналы, сразу на старте программы и забывает про них.

Неправильный connect

[signal] void QLineEdit::textChanged(const QString &text)

Нет сигнала QLineEdit::textChanged() без параметров, поэтому нет входа в слот по connect
Блин, проглядел я это. Кстати, юзайте новый стиль коннектов, тогда и проблем будет меньше.

Код
C++ (Qt)
connect (edit, &QLineEdit::textChanged, this, &MainWindow::block_symbols_in_polya)


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Igors от Май 21, 2020, 11:09
Тогда обработка не происходит. Да, компиляция проходит, но ограничения на поля, из метода, не срабатывают(там если что, ограничения для ввода в поля до вещественных чисел).
Как говорят буржуи "please be more concrete". Слот получает упр-е? Может не срабатывают валидаторы? (там фокус известный).  И вместо textChanged, что зовется на каждый чих, лучше textEdited, и не париться с readOnly

Формулируйте так чтобы не возникало множества наводящих вопросов, цените свое и чужое время


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: kambala от Май 21, 2020, 17:53
ошибки о несуществующем сигнале/слоте разве не выводятся в лог приложения?

к тому же, было заявление от ТС
Цитировать
Да и потом, если я вместо obj пишу конкретное поле(например lineEdit_1), то всё нормально, функция делает что должна.
значит вход в слот происходил


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Hero Sanya от Май 21, 2020, 23:10
Цитировать
К сожалению код топикстартера не проверял... Но мне показалось не очень корректным, что он создал кучу коннектов, а если "куча полей" пополнится еще парочкой, то придется писать дополнительные коннекты... Вот и привел пример, исключающий эту проблему. На истину в последней инстанции не претендую  :)
Да, эта куча полей действительно пополнится новыми полями и как бы коннекты не так страшно было делать(просто копирование/вставка)+ они находятся в одном месте из-за чего их легко редактировать. Просто суть была в том, чтобы избежать создания однотипных методов с одним и тем же действием, вот я и решил свести их до одного метода.


Название: Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
Отправлено: Hero Sanya от Май 21, 2020, 23:15
Цитировать
Блин, проглядел я это. Кстати, юзайте новый стиль коннектов, тогда и проблем будет меньше.

Код
C++ (Qt)
connect (edit, &QLineEdit::textChanged, this, &MainWindow::block_symbols_in_polya)
Даааа, это то что нужно!!! Всё можно закрывать тему.