Russian Qt Forum
Июль 13, 2020, 02:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.  (Прочитано 702 раз)
tamplier
Новичок

Offline Offline

Сообщений: 40


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

Сообщений: 5788


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


Просмотр профиля WWW
« Ответ #16 : Май 21, 2020, 08:52 »

В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.
Записан

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

Offline Offline

Сообщений: 40


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

В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.

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

Сообщений: 5788


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


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

В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.

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

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

Сообщений: 578


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

по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте Грустный
Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле.

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

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

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

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

Offline Offline

Сообщений: 40


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

В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.

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

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

Offline Offline

Сообщений: 40


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

по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте Грустный
Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле.

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

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

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

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

Извиняюсь за оффтоп: Это лучший совет! )
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5788


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


Просмотр профиля WWW
« Ответ #22 : Май 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)
Записан

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

Сообщений: 10811


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

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

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

Сообщений: 4183



Просмотр профиля WWW
« Ответ #24 : Май 21, 2020, 17:53 »

ошибки о несуществующем сигнале/слоте разве не выводятся в лог приложения?

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

Изучением 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



Просмотр профиля
« Ответ #25 : Май 21, 2020, 23:10 »

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

Offline Offline

Сообщений: 34



Просмотр профиля
« Ответ #26 : Май 21, 2020, 23:15 »

Цитировать
Блин, проглядел я это. Кстати, юзайте новый стиль коннектов, тогда и проблем будет меньше.

Код
C++ (Qt)
connect (edit, &QLineEdit::textChanged, this, &MainWindow::block_symbols_in_polya)
Даааа, это то что нужно!!! Всё можно закрывать тему.
« Последнее редактирование: Май 21, 2020, 23:19 от Hero Sanya » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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