Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, 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
пробовал, не реагирует 
Код

connect(widget.lineEdit, SIGNAL(editingFinished()), SLOT(isEmpty_1));

где вместо editingFinished() перепробовал все что в принципе возможно для данной ситуации

Автор: alexvs11 11.5.2012, 22:03
revanatar, connect true возвращает?

Автор: revanatar 11.5.2012, 22:30
Вот так проверил, вывело 0
Код

if(connect(widget.lineEdit, SIGNAL(editingFinished()), SLOT(isEmpty_1)) == true)
    {widget.textBrowser->insertPlainText("1");}
    else
        {widget.textBrowser->insertPlainText("0");}

Автор: revanatar 11.5.2012, 22:51
в общем не соединяет почему-то

Автор: borisbn 12.5.2012, 06:12
Что пишет в окне Output?
isEmpty_1 точно описана как слот?

Автор: _GRIN_ 12.5.2012, 08:16
Цитата(revanatar @  11.5.2012,  19:54 Найти цитируемый пост)

пробовал, не реагирует 
Код

connect(widget.lineEdit, SIGNAL(editingFinished()), SLOT(isEmpty_1));

где вместо editingFinished() перепробовал все что в принципе возможно для данной ситуации


попробуй для isEmpty_1 добавить скобки 

Код

connect(widget.lineEdit, SIGNAL(editingFinished()), SLOT(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
Цитата(borisbn @ 12.5.2012,  06:12)
Что пишет в окне Output?
isEmpty_1 точно описана как слот?

Код

class newForm : public QMainWindow{
    Q_OBJECT

public:
    newForm();
    virtual ~newForm();

private:
    Ui::newForm widget;

public slots:
    void geffe();
    void isEmpty_1();

};

в netbeans сижу.

Автор: borisbn 12.5.2012, 11:51
Цитата(borisbn @  12.5.2012,  06:12 Найти цитируемый пост)
Что пишет в окне Output?

так и не ответил
и потом, тебе _GRIN_ абсолютно точно указал на ошибку

Автор: revanatar 12.5.2012, 11:53
Цитата(_GRIN_ @ 12.5.2012,  08:16)
Цитата(revanatar @  11.5.2012,  19:54 Найти цитируемый пост)

пробовал, не реагирует 
Код

connect(widget.lineEdit, SIGNAL(editingFinished()), SLOT(isEmpty_1));

где вместо editingFinished() перепробовал все что в принципе возможно для данной ситуации


попробуй для isEmpty_1 добавить скобки 

Код

connect(widget.lineEdit, SIGNAL(editingFinished()), SLOT(isEmpty_1()));

Со скобками то же самое.

Автор: 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
Цитата(revanatar @  14.5.2012,  14:00 Найти цитируемый пост)
Писал же: netbeans.

а, да. только сейчас заметил
Цитата(revanatar @  12.5.2012,  12:08 Найти цитируемый пост)
Что за окно Output? 

В 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
Цитата(borisbn @  14.5.2012,  16:08 Найти цитируемый пост)
по идее кутя напишет проблему прямо в консоли  

в windows это не работает

Автор: _GRIN_ 14.5.2012, 23:26
Код

<path_to_prog>\myprog.exe > output.txt

насколько я помню работает и в винде.
Ну а сюда выложи текст из   output.txt - тогда можно будет дальше думать.

Автор: revanatar 15.5.2012, 00:37
Видимо не работает, просто прога открылась, output.txt пустой. 
Конечно, такие танцы с бубном не тема, надо на родную ide переходить smile
Хз когда эклипсоделы и/или нетбинсофилы сделают норм интеграцию.

Автор: math64 15.5.2012, 08:02
В Windows нужно скачать DebugView.zip с microsoft.com

Автор: borisbn 15.5.2012, 08:26
Цитата(math64 @  15.5.2012,  08:02 Найти цитируемый пост)
В Windows нужно скачать DebugView.zip с microsoft.com 

хммм... точно. как-то сразу не дошло. он у меня есть. лови в аттаче

Автор: revanatar 15.5.2012, 18:45
Код

[2252] Object::connect: No such signal QLineEdit::textChanged() 


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

Автор: _GRIN_ 15.5.2012, 23:02
revanatar,  сначала ты писал:

Цитата(revanatar @  11.5.2012,  19:54 Найти цитируемый пост)
пробовал, не реагирует 
connect(widget.lineEdit, SIGNAL(editingFinished()), SLOT(isEmpty_1));


Цитата(revanatar @  12.5.2012,  10:08 Найти цитируемый пост)

Скобки потерялись после попыток сделать по-другому.


лог выводит, что ты коннектишь сигнал с другой сигнатуров (с параметром QString):

Цитата(revanatar @  15.5.2012,  16:45 Найти цитируемый пост)

Код

[2252] Object::connect: No such signal QLineEdit::textChanged() 

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


ты выложи тот код, который ты запускаешь =) - а то совсем нас запутал.

P.S. сигнатура сигнала и слота при коннекте должна указываться - а у тебя сигнал указан с неправильной сигнатурой, вот кьют сигнал и не нашёл.

Автор: revanatar 16.5.2012, 16:32
Код

newForm::newForm() {
    widget.setupUi(this);

    connect(widget.pushButton, SIGNAL(clicked()), SLOT(geffe()));


    if(connect(widget.lineEdit, SIGNAL(textChanged()), SLOT(isEmpty_1())))
        {widget.textBrowser->insertPlainText("1");}
    else
        {widget.textBrowser->insertPlainText("0");}
}

newForm::~newForm() {

}

void newForm::isEmpty_1()
{
    if(widget.lineEdit->text().size() == 0)
        {
        widget.lineEdit_2->setEnabled(0);
        widget.pushButton->setEnabled(0);
        }
    else
        {
        widget.lineEdit_2->setEnabled(1);
        widget.pushButton->setEnabled(1);
        }
}

Автор: borisbn 16.5.2012, 16:37
Цитата(revanatar @  15.5.2012,  18:45 Найти цитируемый пост)
 No such signal QLineEdit::textChanged() 

значит "нет такого сигнала QLineEdit::textChanged()". Есть только такой 
http://qt-project.org/doc/qt-4.8/qlineedit.html#textChanged
вот и нужно коннектить
Код
 if(connect(widget.lineEdit, SIGNAL(textChanged(const QString &)), SLOT(isEmpty_1(const QString &))))

а isEmpty_1() описать так
Код
void newForm::isEmpty_1( const QString & )


Автор: revanatar 16.5.2012, 16:56
Цитата
void newForm::isEmpty_1( const QString & )

Почему так? В смысле зачем туда const QString & ?

Автор: borisbn 16.5.2012, 16:58
Цитата(revanatar @  16.5.2012,  16:56 Найти цитируемый пост)
зачем туда const QString &

затем, что сигнал, на который ты законнекчиваешь этот слот передаёт строку...
хотя... можешь попробовать
Код
connect(widget.lineEdit, SIGNAL(textChanged(const QString &)), SLOT(isEmpty_1())))

а isEmpty_1() оставить без изменений. я, просто, не помню в сигнале или в слоте может быть больше аргументов, но сигнатура в connect точно должна совпадать с описанием

Автор: revanatar 16.5.2012, 17:04
isEmpty_1()  - работает
Вопрос не по теме: каким макаром и куда можно БЫСТРО выводить текст на форму посимвольно. Такие вещи как insertPlainText("") и аналогичные начинают тормозить программу, если обращаться к ним в цикле.

Автор: _GRIN_ 16.5.2012, 22:43
Цитата(revanatar @  16.5.2012,  14:56 Найти цитируемый пост)
Почему так? В смысле зачем туда const QString & ? 

Потому что сигналы-слоты - это по сути обвязка над "указателями на функции", которая разруливается moc-препроцессором.
Читай про механиз сигналов-слотов тут: http://qt-project.org/doc/qt-4.8/signalsandslots.html

Цитата(borisbn @  16.5.2012,  14:37 Найти цитируемый пост)

а isEmpty_1() описать так
void newForm::isEmpty_1( const QString & )

как показывает практика - к слоту без параметров свободно коннектятся сигналы с любыми параметрами (и любым их количеством).




Автор: Sality123 17.5.2012, 14:21
Цитата(revanatar @ 16.5.2012,  17:04)

Вопрос не по теме: каким макаром и куда можно БЫСТРО выводить текст на форму посимвольно. Такие вещи как insertPlainText("") и аналогичные начинают тормозить программу, если обращаться к ним в цикле.

Ну можно 
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 @  16.5.2012,  18:04 Найти цитируемый пост)
Вопрос не по теме: каким макаром и куда можно БЫСТРО выводить текст на форму посимвольно. Такие вещи как insertPlainText("") и аналогичные начинают тормозить программу, если обращаться к ним в цикле. 

смотри, если ты откуда-то читаешь посимвольно, и тут же каждый символ пихаешь в виджет, то будет тормозить. Так как производится еще обработка текста и куча дополнительных операций. Лучше добавлять каждый символ во временную текстовую переменную, а когда все символы будут обработаны, то ее содержимое добавить к тексту виджета. Это значительно ускорит работу программы.

Автор: revanatar 17.5.2012, 21:18
Цитата(bsa @ 17.5.2012,  15:24)
Цитата(revanatar @  16.5.2012,  18:04 Найти цитируемый пост)
Вопрос не по теме: каким макаром и куда можно БЫСТРО выводить текст на форму посимвольно. Такие вещи как insertPlainText("") и аналогичные начинают тормозить программу, если обращаться к ним в цикле. 

смотри, если ты откуда-то читаешь посимвольно, и тут же каждый символ пихаешь в виджет, то будет тормозить. Так как производится еще обработка текста и куча дополнительных операций. Лучше добавлять каждый символ во временную текстовую переменную, а когда все символы будут обработаны, то ее содержимое добавить к тексту виджета. Это значительно ускорит работу программы.

Да, ускорит, но у меня случай  когда я не знаю длинны текста, и зачастую он большой, максимальное количество символов спокойно может переполнить uint. Я так понимаю что ничего быстрей нету? Тогда выводить в файл только остается.

Автор: math64 18.5.2012, 07:15
Делай ограничения по числу символов (например, после накопления 80 символов буфер выводится на экран), времени (по прошествии 5 сек буфер выводится на экран), терминальных символов (при получении перевода строки буфер выводится на экран).

Автор: revanatar 18.5.2012, 11:23
Цитата(math64 @ 18.5.2012,  07:15)
Делай ограничения по числу символов (например, после накопления 80 символов буфер выводится на экран), времени (по прошествии 5 сек буфер выводится на экран), терминальных символов (при получении перевода строки буфер выводится на экран).

Да просто нету гарантий что текст "влезет".

Автор: math64 18.5.2012, 16:55
Цитата(revanatar @  18.5.2012,  11:23 Найти цитируемый пост)
Да просто нету гарантий что текст "влезет". 

Ну, если размер текста не влезает с оперативку - обычный текстовый редактор не пойдёт.
Возможно, удобнее складывать не в простой файл, а в базу данных, а выводить в QLisTView с QSqlTableModel (хотя возможно, придётся свою модель написать).
Но для записив БД придётся точно также делить на куски.

Автор: revanatar 18.5.2012, 18:00
Цитата(math64 @ 18.5.2012,  16:55)
Цитата(revanatar @  18.5.2012,  11:23 Найти цитируемый пост)
Да просто нету гарантий что текст "влезет". 

Ну, если размер текста не влезает с оперативку - обычный текстовый редактор не пойдёт.
Возможно, удобнее складывать не в простой файл, а в базу данных, а выводить в QLisTView с QSqlTableModel (хотя возможно, придётся свою модель написать).
Но для записив БД придётся точно также делить на куски.

Не в оперативке дело, а например в textBrowser, длинна текста которого возвращается в int.

Автор: bsa 18.5.2012, 21:34
revanatar, ну и? Тебе указанный инструментарий в принципе не подходит (если честно, подобное количество текста в принципе человеком сложно воспринимается). Или меняй задачу или ищи другой инструментарий.

Автор: math64 18.5.2012, 22:54
Цитата(revanatar @  18.5.2012,  18:00 Найти цитируемый пост)
Не в оперативке дело, а например в textBrowser, длинна текста которого возвращается в int. 

int - 32 разрядное число. Если длина в него не влезает, массив, как правило, не влезет в оперативку. Если это не 64-разрядный компьютер с не менее чем 4GB памяти, причём операционка такую память  может предоставить приложению пользователя.

Автор: revanatar 19.5.2012, 12:37
Цитата(math64 @ 18.5.2012,  22:54)
Цитата(revanatar @  18.5.2012,  18:00 Найти цитируемый пост)
Не в оперативке дело, а например в textBrowser, длинна текста которого возвращается в int. 

int - 32 разрядное число. Если длина в него не влезает, массив, как правило, не влезет в оперативку. Если это не 64-разрядный компьютер с не менее чем 4GB памяти, причём операционка такую память  может предоставить приложению пользователя.

А, я забыл что int меняет свой размер smile , извиняюсь, все влезет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)