Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/37: Рейтинг темы: голосов - 37, средняя оценка - 4.68
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533

QT: странная работа сигнала textEdited(QString) элемента QLineEdit

06.10.2011, 14:48. Показов 7196. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи!
Столкнулся тут с непонятным поведением QT.

Есть след. код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
enum LINE_EDIT_MODE {LINE_EDIT_DALLAS, LINE_EDIT_METAKOM, LINE_EDIT_CYFRAL, LINE_EDIT_RFID};
class MyLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    MyLineEdit(LINE_EDIT_MODE, QWidget *parent = 0);
    ~MyLineEdit();
private:
    QString line_dallas;
    QString line_metakom;
    QString line_cyfral;
    QString line_rfid;
    LINE_EDIT_MODE mode;
public slots:
    void setMode(int);             
private slots:
    void ChangeText(const QString &);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
MyLineEdit::MyLineEdit(LINE_EDIT_MODE lem, QWidget *parent):QLineEdit(parent)
{
    mode = lem;
    crc_check = check;
    // Считать line_1,..., line_4 из настроек, пока все ноль
    line_dallas = "0000000000000000";
    line_metakom = "0000000000";
    line_cyfral = "00000000";
    line_rfid = "0000";
    setAlignment(Qt::AlignCenter);
    switch(mode)
    {
    case LINE_EDIT_DALLAS:
        setInputMask(">HH HH HH HH HH HH HH HH");
        setText(line_dallas);
        break;
    case LINE_EDIT_METAKOM:
        setInputMask(">HH HH HH HH HH");
        setText(line_metakom);
        break;
    case LINE_EDIT_CYFRAL:
        setInputMask(">HH HH HH HH");
        setText(line_cyfral);
        break;
    case LINE_EDIT_RFID:
        setInputMask(">HH HH");
        setText(line_rfid);
        break;
    }
    connect(this, SIGNAL(textEdited(QString)),this, SLOT(ChangeText(QString)));
}
 
void MyLineEdit::setMode(int index)
{
    if ((index > 3) || (index < 0))
        return;
    QMessageBox::about(0,"setMode",QString::number(mode,10));
    QMessageBox::about(0,"index",QString::number(index,10));
    switch(mode)
    {
    case LINE_EDIT_METAKOM:
        line_metakom = text().remove(' ');
        break;
    case LINE_EDIT_CYFRAL:
        line_cyfral = text().remove(' ');
        break;
    case LINE_EDIT_RFID:
        line_rfid = text().remove(' ');
        break;
    case LINE_EDIT_DALLAS:
    default:
        line_dallas = text().remove(' ');
    }
 
    mode = static_cast<LINE_EDIT_MODE>(index);
 
    switch(mode)
    {
    case LINE_EDIT_METAKOM:
        setMaxLength(10);
        setInputMask(">HH HH HH HH HH");
        setText(line_metakom);
        emit CanCheckCrc(false);
        break;
    case LINE_EDIT_CYFRAL:
        setMaxLength(8);
        setInputMask(">HH HH HH HH");
        setText(line_cyfral);
        emit CanCheckCrc(false);
        break;
    case LINE_EDIT_RFID:
        setMaxLength(4);
        setInputMask(">HH HH");
        setText(line_rfid);
        emit CanCheckCrc(false);
        break;
    case LINE_EDIT_DALLAS:
    default:
        setMaxLength(16);
        setInputMask(">HH HH HH HH HH HH HH HH");
        setText(line_dallas);
        emit CanCheckCrc(true);
    }
}
 
void MyLineEdit::ChangeText(const QString &text)
{
    QMessageBox::about(0,"ChangeText",QString::number(mode,10));
    QMessageBox::about(0,"Text",text);
    QString temp = text;
    temp.remove(' ');
    switch (mode)
    {
    case LINE_EDIT_DALLAS:
        line_dallas = temp;
        if (crc_check)
            CalcCRC();
        break;
    case LINE_EDIT_METAKOM:
        line_metakom = temp;
        break;
    case LINE_EDIT_CYFRAL:
        line_cyfral = temp;
        break;
    case LINE_EDIT_RFID:
        line_rfid = temp;
        break;
    }
}
Так вот, при смене режимов при помощи функции setMode() генерится сигнал textEdited
(хотя в документации сказано, что данный сигнал не генерится при программном изменении текста, в частности функцией setText). Мало того, параметр сигнала соответствует старому значению текста, а вроде как должен содержать новое значение.
Так, если я сначала меняю режим с 0 на 1, то все нормально, вид будет такой:
00 00 00 00 00 00 00 00 [0 режим] -> 00 00 00 00 00 [1 режим]
А вот когда меняю обратно с 1 на 0, то получаем
00 00 00 00 00 [1 режим] -> 00 00 00 00 00 .. .. [0 режим]
при этом, генерится сигнал textEdited с параметром "00 00 00 00 00" вместо "00 00 00 00 00 00 00 00"

Путанно написал, но надеюсь на вашу помощь )
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2011, 14:48
Ответы с готовыми решениями:

Странная форма сигнала
Изучаю опыт с магнитом в трансформаторе: Получается интересная форма сигнала - где на экстремумах синуса появляются пики. Суть...

Странная ошибка при привязке сигнала и слота. Использую Qt
ругается на строчку: QObject::connect(mw-&gt;QWdownloadProgramm, SIGNAL(clicked()), vw, SLOT(QWDownloadCliked())); пишет: ошибка: нет...

Ошибка: 'QLineEdit' does not name a type QLineEdit* m_ptxInp
Уважаемые,что то я ковырялся -ковырялся, писал клиент для сервера. ПО типу чат. Все работало. И тут ни с того ни с сего как будто...

13
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
06.10.2011, 17:01
сигнал посылается как только текст начал изменяться а не когда он закончился редактироваться, вот и получается что вы получаете "старый" текст, попробуйте др сигнал, тот же editingFinished () которые высылается после того как текст полностью от редактировался
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
06.10.2011, 17:12  [ТС]
Чистый, но как быть с тем, что согласно документации данный сигнал вообще не должен генерироваться при программном изменении текста? В частности изменение функцией setText данный сигнал почему-то генерится, хотя вроде как не должен
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
06.10.2011, 17:45
а вы справку перечитайте более подробно скажем с переводчиком английского стоящим слева (справа, кому как удобно) и тогда все встанет на свои места:
This signal is emitted whenever the text changes. The text argument is the new text.

Unlike textEdited(), this signal is also emitted when the text is changed programmatically, for example, by calling setText().
я конечно не силен в англ но все же мне кажется что тут написано что то подобное:
В отличие от textEdited(), этот сигнал также посылается, когда текст изменен программным способом, например, с помощью метода setText ().
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
06.10.2011, 17:48  [ТС]
Ну так вы смотрите описание сигнала textChanged, а у меня используется textEdited.
И из вашего же перевода следует, что textEdited не вызывается при программном изменении текста, а вот textChanged должен вызываться
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
06.10.2011, 17:58
блин не тот сигнал посмотрел, да он не должен отрабатывать при программном изменении.... вечером дома проверю отрабатывает или нет, если нет то проблема в твоем коде тогда и будем искать
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
06.10.2011, 18:03  [ТС]
Одно дополнение: прогу запускал под виндой. Дома проверю это дело на Linux
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
07.10.2011, 11:33
не у меня все нормально отрабатывает, так как положено см пример
Вложения
Тип файла: rar untitled5.rar (3.1 Кб, 29 просмотров)
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
07.10.2011, 13:30  [ТС]
Чистый, архив битый, не открывается.
Под чем экспериментировали? Под виндой или под Linux?
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
07.10.2011, 13:35
только что выкачал, открылся нормально, проверял на работе на Win
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
07.10.2011, 13:41  [ТС]
У меня Rar-a нету на работе (и поставить не могу из-за ограничений), а WinZip не открывает. Пишет:
Cannot open file: it does not appear to be a valid archive.
Не могли бы вы переархивировать зипом ну или самораспаковывающийся архив сделать?
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
07.10.2011, 17:49
могу...
Вложения
Тип файла: 7z untitled5.7z (5.7 Кб, 8 просмотров)
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
07.10.2011, 20:57  [ТС]
Что-то я не нашел в коде функций connect... Вроде и в описании формы никаких хвостов...
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
07.10.2011, 20:59
connect создается автоматически когда переходишь к слоту через редактор форм в QtCreatr-e
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2011, 20:59
Помогаю со студенческими работами здесь

Слоты и сигналы, работа с QLineEdit
Имеется следующий код: Файл dialog.h #ifndef DIALOG_H #define DIALOG_H #include &lt;QDialog&gt; #include &lt;QWidget&gt; #include...

Как в Qt создать привязку табличных данных к QLineEdit через QSqlQueryModel с возможностью пересчета данных в таблице и на форме в QLineEdit
Уважаемые пишу программу с большим количеством вычислений возник вопрос Как в Qt создать привязку табличных данных к QLineEdit через...

Работа с QString
подскажите , пожалуйста, аналоги функциям pos &amp; copy из delphi Function Pos(Substr : String; S : String) : Byte; Function Copy(S :...

работа c qstring
пишу текстовый редактор , QString word=ui-&gt;lineEdit-&gt;text(); QString word2=ui-&gt;lineEdit_2-&gt;text(); QString str...

QFile::rename(QString name1, QString name2) не работает под Win
Добрый день! Столкнулся с проблемой: QFile::rename(QString name1, QString name2) не работает под Windows 7. На CentOS 6 нормально -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru