Russian Qt Forum

Qt => Общие вопросы => Тема начата: labview от Июль 30, 2010, 14:21



Название: Обработка сигнала в слоте
Отправлено: labview от Июль 30, 2010, 14:21
Привет!

Пытаюсь написать "Здравствуй мир" в QtCreator. Создал слот с помощью ПКМ, в cpp-файле появилась пустая вызываемая функция для обработки сигнала. Мне бы хотелось добавить в QString слово "Hello" и выдать его во второй LineEdit.

При компиляции выдаёт ошибку, что Message не декларирован в этой секции. Как мне сделать LineEdit Message доступным в этой функции?

Спасибо, labview

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_YourName_textEdited(QString )
{
    Message.SetText(QString);
}


Название: Re: Обработка сигнала в слоте
Отправлено: crossly от Июль 30, 2010, 14:23
а что есть Message ??


Название: Re: Обработка сигнала в слоте
Отправлено: labview от Июль 30, 2010, 14:24
а что есть Message ??

Это второй LineEdit, в который я хочу выдать сообщение "Hello имя!".


Название: Re: Обработка сигнала в слоте
Отправлено: crossly от Июль 30, 2010, 14:27
Код:
void MainWindow::on_YourName_textEdited(const QString &text)
{
    text.append(" Hello");
    ui->Message->setText(text);
}


Название: Re: Обработка сигнала в слоте
Отправлено: labview от Июль 30, 2010, 15:01
Сделал так, работает:

Код:
void MainWindow::on_YourName_textEdited(const QString &text)
{
    ui->Message->setText("Hello " + text);
}

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

Спасибо


Название: Re: Обработка сигнала в слоте
Отправлено: crossly от Июль 30, 2010, 15:04
в этом месте отрываем документацию и начинаем курить ее на предмет механизма сигнал/слот....


Название: Re: Обработка сигнала в слоте
Отправлено: labview от Июль 30, 2010, 15:13
Да, я нашёл в документации как редактировать слот в Qt дизайнере, но тот слот, который я создал ручками не имеется в списке слотов в дизайнере, поэтому я немогу редактировать тип и отправителя сигнала.
Цитировать
The Signal/Slot Editor
The signal and slot used in a connection can be changed after it has been set up. When a connection is configured, it becomes visible in Qt Designer's signal and slot editor where it can be further edited. You can also edit signal/slot connections by double-clicking on the connection path or one of its labels to display the Connection Dialog.
Пожалуста ткните носом чайника в нужную страницу в документации.


Название: Re: Обработка сигнала в слоте
Отправлено: crossly от Июль 30, 2010, 15:16
а ты попробуй забыть на денек о дизайнере... и по пробуй сделать все без него... а когда снизойдет на тебя.... тогда можешь и вспомнить о нем...


Название: Re: Обработка сигнала в слоте
Отправлено: labview от Июль 30, 2010, 15:24
Я бы с удовольствием, но мне кажется дизайнер сильно облегчает работу с пользовательским интерфейсом, т.к. не нужно парить свой мозг различными чайлдами, лейаутами, размерами и позиционированием элементов. Зачем делать сложно, когда можно сделать легко.

Но это моё личное мнение, я не собираюсь спорить по этому поводу с профи.

Так дайте мне пожалуйста инфу как изменить тип и отправителя сигнала в созданном слоте. Спасибо.


Название: Re: Обработка сигнала в слоте
Отправлено: lit-uriy от Июль 30, 2010, 15:28
labview, делай всё в коде.
Дизайнер - помощник для тех, кто уже понимает, что делает. А для новичков - враг.


Название: Re: Обработка сигнала в слоте
Отправлено: lit-uriy от Июль 30, 2010, 15:31
Читай это (http://doc.crossplatform.ru/qt/4.6.x/object.html) и это (http://doc.crossplatform.ru/qt/4.6.x/signalsandslots.html)


Название: Re: Обработка сигнала в слоте
Отправлено: crossly от Июль 30, 2010, 15:39
Я бы с удовольствием, но мне кажется дизайнер сильно облегчает работу с пользовательским интерфейсом, т.к. не нужно парить свой мозг различными чайлдами, лейаутами, размерами и позиционированием элементов. Зачем делать сложно, когда можно сделать легко.

Но это моё личное мнение, я не собираюсь спорить по этому поводу с профи.

Так дайте мне пожалуйста инфу как изменить тип и отправителя сигнала в созданном слоте. Спасибо.
я не предлагаю забросить дизайнер вообще... я предлагаю разобраться что к чему.... а когда придет понимание тогда пользуйтесь на здоровье... 


Название: Re: Обработка сигнала в слоте
Отправлено: labview от Июль 30, 2010, 16:05
Вот урок по которому я делал программу:
http://netbeans.org/kb/docs/cnd/qt-applications.html

В этом уроке само окно и два LineEdit элемента создаются в дизайнере, а слот создаётся без дизайнера. Но я так и не понимаю где указана привязка элемента-отправителя к слоту. А так же тип сигнала это textChanged, это ли и есть название слота?

Почитал немного о сигналах и слотах, но так и не врубился. Сори.

Получается слот привязан не к элементу LineEdit, а к классу MainWindow, который как то связан с LineEdit. Всё это как то происходит через moc. С типом сигнала так же не смог разобраться.

Ну что же, жаль, придётся звонить брату и спрашивать у него  :-\


Название: Re: Обработка сигнала в слоте
Отправлено: lit-uriy от Июль 30, 2010, 16:12
В Qt предусмотрена довольно подлая возможность под названием "автосоединение" сделана для новичков, по аналогии с обработчиком событий в ВизуалБасике и Борланде.
Категорически мешающая пониманию сигналов/слотов.

У тролей был длинноватый, но очень хороший учебник в предыдущих версиях, теперь они его убрали из документации.
Смотри его здесь (http://doc.crossplatform.ru/qt/4.4.3/tutorials-tutorial.html) (на русском).


Название: Re: Обработка сигнала в слоте
Отправлено: crossly от Июль 30, 2010, 16:19
>>В этом уроке само окно и два LineEdit элемента создаются в дизайнере, а слот создаётся без дизайнера.
Дизайнер предназначен только для создания ГУИ и не предназначен для создания слотов... в нем можно соединить только существующие сигналы/слоты библиотеки....

>>Но я так и не понимаю где указана привязка элемента-отправителя к слоту.
Код:
connect(widget.nameEdit,SIGNAL(textChanged(const QString &)),this,SLOT(textChanged(const QString &)));

>>А так же тип сигнала это textChanged, это ли и есть название слота?
в этом примере сигнал и слот имеют одинаковые имена...  
Код:
SIGNAL(textChanged(const QString &)) - здесь сигнал, SLOT(textChanged(const QString &)) - здесь слот 

>>Получается слот привязан не к элементу LineEdit, а к классу MainWindow, который как то связан с LineEdit.
слот это метод класса MainWindow (на лицо не понимание с++)


Название: Re: Обработка сигнала в слоте
Отправлено: labview от Июль 30, 2010, 16:26
Всё, теперь врубился. Функция connect всё делает. Спасибо, думаю разобрался.

Да, C++ у меня хромает, я уже прилично долго и профессионально программирую на другом языке программирования, где для меня всё понятно. Могу и учу других людей.


Название: Re: Обработка сигнала в слоте
Отправлено: labview от Август 05, 2010, 21:55
Привет ещё разок!

У меня есть виджет SettingsWidget с сигналом open. Этот виджет является паблик мембером виджета MainWidget, который и является основным в программе. Так же у меня есть SerialThread типа QThread, который известен в main.

Могу ли я связать сигнал подвиджета SettingsWidget со слотом SerialThread? Или мне нужно обязательно связать сигнал подвиджета со слотом MainWidget, а потом связать сигнал MainWidget со слотом SerialThread?

Спасибо, надеюсь понятно обьяснил  ;)


Название: Re: Обработка сигнала в слоте
Отправлено: SimpleSunny от Август 05, 2010, 21:59
Можете
connect(mainWindow->settingsWidget, SIGNAL(open()), serialThread, SLOT(slot()));


Название: Re: Обработка сигнала в слоте
Отправлено: labview от Август 05, 2010, 22:02
Клёво, получилось. Ждите скоро мою первую прогу.