| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > qt события |
| Автор: revanatar 11.5.2012, 21:31 |
| Вот например у меня есть QlineEdit обьект и еще всякая всячина на форме, в lineEdit задан начальный текст. Вопрос а том, как сделать чтобы при любом изменении текста в нем, выполнялась моя функция, например при пустом lineEdit делать неактивными остальные элементы на форме? |
| Автор: alexvs11 11.5.2012, 21:45 |
| revanatar, сигналы textChanged/textEdited в помощь |
| Автор: revanatar 11.5.2012, 21:54 | ||
пробовал, не реагирует
где вместо editingFinished() перепробовал все что в принципе возможно для данной ситуации |
| Автор: alexvs11 11.5.2012, 22:03 |
| revanatar, connect true возвращает? |
| Автор: revanatar 11.5.2012, 22:30 | ||
Вот так проверил, вывело 0
|
| Автор: revanatar 11.5.2012, 22:51 |
| в общем не соединяет почему-то |
| Автор: borisbn 12.5.2012, 06:12 |
| Что пишет в окне Output? isEmpty_1 точно описана как слот? |
| Автор: math64 12.5.2012, 08:54 |
| Если используешь QtCreator, используй подсказки редактора (если подсказки не появляются сами, используешь Ctrl-Enter): Вводишь con - в подсказке выбираешь connect Подсказка 1 аргумента: sender - вводишь widget.lineEdit, Подсказка 2 аргумента: singal - вводишь SIGNAL( Подсказка сигнала - выбираешь сигнал из списка Подсказка 3 аргумента: receiver или member; в данном случае member - вводишь SLOT( Подсказка слота - выбираешь слот из списка. Если слот ещё не объявлен, он в списке не появится, поэтому сначала объяви слот в заголовке. |
| Автор: revanatar 12.5.2012, 11:49 | ||||
в netbeans сижу. |
| Автор: borisbn 12.5.2012, 11:51 |
так и не ответил и потом, тебе _GRIN_ абсолютно точно указал на ошибку |
| Автор: revanatar 12.5.2012, 11:53 | ||||||||
Со скобками то же самое. |
| Автор: revanatar 12.5.2012, 12:08 |
| Скобки потерялись после попыток сделать по-другому. Что за окно Output? Построил, выполнил? |
| Автор: borisbn 12.5.2012, 16:58 |
| revanatar, какая IDE ? |
| Автор: _GRIN_ 12.5.2012, 23:07 |
| нужен лог выполнения кода, где ты коннект осущствляешь (если коннект динамически например происходит) - кьют напишет, почему коннект неудался (нет такого слота, или сигнала, или указатель на сендера нулевой) - короче нужно лог смотреть а не телепатией заниматься =) |
| Автор: revanatar 14.5.2012, 14:00 |
| Писал же: netbeans. Думал в эклипс перебраться - так там темный лес с настройками. |
| Автор: borisbn 14.5.2012, 14:04 |
а, да. только сейчас заметил В netbeans не знаю. В QtCreator оно называется "Вывод приложения", в студии - "Output"... поищи что-нибудь похожее в твоей IDE. Дело в том, что при возникновении каких-либо проблем в рантайме Qt пишет туда довольно подробное сообщение с описанием проблемы. |
| Автор: revanatar 14.5.2012, 14:30 |
| Для джавы там только есть ( |
| Автор: borisbn 14.5.2012, 15:08 |
| тогда попробуй запустить своё приложение просто из консоли (в windows - cmd.exe, в linux - думаю объяснять не нужно))) по идее кутя напишет проблему прямо в консоли |
| Автор: bsa 14.5.2012, 17:21 |
в windows это не работает |
| Автор: _GRIN_ 14.5.2012, 23:26 | ||
насколько я помню работает и в винде. Ну а сюда выложи текст из output.txt - тогда можно будет дальше думать. |
| Автор: revanatar 15.5.2012, 00:37 |
| Видимо не работает, просто прога открылась, output.txt пустой. Конечно, такие танцы с бубном не тема, надо на родную ide переходить Хз когда эклипсоделы и/или нетбинсофилы сделают норм интеграцию. |
| Автор: math64 15.5.2012, 08:02 |
| В Windows нужно скачать DebugView.zip с microsoft.com |
| Автор: borisbn 15.5.2012, 08:26 |
хммм... точно. как-то сразу не дошло. он у меня есть. лови в аттаче |
| Автор: revanatar 15.5.2012, 18:45 | ||
Сигнал принимает в себя qstring оказывается. Вот только не знаю что передать туда, нужен же конкретный результат. |
| Автор: _GRIN_ 15.5.2012, 23:02 | ||||||
revanatar, сначала ты писал:
лог выводит, что ты коннектишь сигнал с другой сигнатуров (с параметром QString):
ты выложи тот код, который ты запускаешь =) - а то совсем нас запутал. P.S. сигнатура сигнала и слота при коннекте должна указываться - а у тебя сигнал указан с неправильной сигнатурой, вот кьют сигнал и не нашёл. |
| Автор: revanatar 16.5.2012, 16:32 | ||
|
| Автор: borisbn 16.5.2012, 16:37 | ||||
значит "нет такого сигнала QLineEdit::textChanged()". Есть только такой http://qt-project.org/doc/qt-4.8/qlineedit.html#textChanged вот и нужно коннектить
а isEmpty_1() описать так
|
| Автор: revanatar 16.5.2012, 16:56 | ||
Почему так? В смысле зачем туда const QString & ? |
| Автор: borisbn 16.5.2012, 16:58 | ||
затем, что сигнал, на который ты законнекчиваешь этот слот передаёт строку... хотя... можешь попробовать
а isEmpty_1() оставить без изменений. я, просто, не помню в сигнале или в слоте может быть больше аргументов, но сигнатура в connect точно должна совпадать с описанием |
| Автор: revanatar 16.5.2012, 17:04 |
| isEmpty_1() - работает Вопрос не по теме: каким макаром и куда можно БЫСТРО выводить текст на форму посимвольно. Такие вещи как insertPlainText("") и аналогичные начинают тормозить программу, если обращаться к ним в цикле. |
| Автор: _GRIN_ 16.5.2012, 22:43 | ||
Потому что сигналы-слоты - это по сути обвязка над "указателями на функции", которая разруливается moc-препроцессором. Читай про механиз сигналов-слотов тут: http://qt-project.org/doc/qt-4.8/signalsandslots.html
как показывает практика - к слоту без параметров свободно коннектятся сигналы с любыми параметрами (и любым их количеством). |
| Автор: Sality123 17.5.2012, 14:21 | ||
Ну можно 1) доставать данные ui->plineText->text() 2) прибавляем символ string.append("d") 3) пихаем результат опять в плайнтекст ui->plineText->setText(string) непомню точно, может есть функция проще у плайнтекста типо ui->plineText->append("s") Ах да, любой цикл будет тормозить программу, если он долго обрабатывает команды. Не думаю что insertPlainText("") настолько тугой. Скорее всего в твоем цикле либо очень много задач что он неуспевает их отработать быстро без видимого зависания програмы. |
| Автор: bsa 17.5.2012, 15:24 | ||
смотри, если ты откуда-то читаешь посимвольно, и тут же каждый символ пихаешь в виджет, то будет тормозить. Так как производится еще обработка текста и куча дополнительных операций. Лучше добавлять каждый символ во временную текстовую переменную, а когда все символы будут обработаны, то ее содержимое добавить к тексту виджета. Это значительно ускорит работу программы. |
| Автор: revanatar 17.5.2012, 21:18 | ||||
Да, ускорит, но у меня случай когда я не знаю длинны текста, и зачастую он большой, максимальное количество символов спокойно может переполнить uint. Я так понимаю что ничего быстрей нету? Тогда выводить в файл только остается. |
| Автор: math64 18.5.2012, 07:15 |
| Делай ограничения по числу символов (например, после накопления 80 символов буфер выводится на экран), времени (по прошествии 5 сек буфер выводится на экран), терминальных символов (при получении перевода строки буфер выводится на экран). |
| Автор: revanatar 18.5.2012, 11:23 | ||
Да просто нету гарантий что текст "влезет". |
| Автор: math64 18.5.2012, 16:55 |
Ну, если размер текста не влезает с оперативку - обычный текстовый редактор не пойдёт. Возможно, удобнее складывать не в простой файл, а в базу данных, а выводить в QLisTView с QSqlTableModel (хотя возможно, придётся свою модель написать). Но для записив БД придётся точно также делить на куски. |
| Автор: revanatar 18.5.2012, 18:00 | ||
Не в оперативке дело, а например в textBrowser, длинна текста которого возвращается в int. |
| Автор: bsa 18.5.2012, 21:34 |
| revanatar, ну и? Тебе указанный инструментарий в принципе не подходит (если честно, подобное количество текста в принципе человеком сложно воспринимается). Или меняй задачу или ищи другой инструментарий. |
| Автор: math64 18.5.2012, 22:54 | ||
int - 32 разрядное число. Если длина в него не влезает, массив, как правило, не влезет в оперативку. Если это не 64-разрядный компьютер с не менее чем 4GB памяти, причём операционка такую память может предоставить приложению пользователя. |
| Автор: revanatar 19.5.2012, 12:37 | ||||
А, я забыл что int меняет свой размер |