Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Disa от Января 19, 2012, 15:28



Название: [РЕШЕНО] Не удается поймать сигнал
Отправлено: Disa от Января 19, 2012, 15:28
Добрый день.
Дочерний класс от MainWindow кидает сигнал при изменении одной из переменных в неком методе (как я понимаю, не важно в каком именно):
Код:
if (...) {
  current_element_index = index;
  emit changeCurrentIndex();
}

В это ветвление программа попадает достаточное количество раз (то есть хотя бы один раз, проверенно дебаггером).

Родитель ловит этот сигнал в конце конструктора:
Код:
void MainWindow::MainWindow() {
  setAttribute(Qt::WA_DeleteOnClose);

  editor = new editorScene(this);
  setCentralWidget (editor);
  createDockWindows();

  connect(editor, SIGNAL(changeCurrentIndex()), this,
              SLOT(drawTerminalViewer(editorScene*)));
}

Тут:
Код:
void MainWindow::createDockWindows() {
  dock = new QDockWidget(tr("Terminal viewer"), this);
  dock->setAllowedAreas(Qt::RightDockWidgetArea);

  terminal_viewer = new QLabel(dock);
  dock->setWidget     (terminal_viewer);
  dock->setFeatures   (QDockWidget::NoDockWidgetFeatures);
}

и
Код:
void MainWindow::drawTerminalViewer (editorScene *_editor) {
  QString test = "Index_change!";
  terminal_viewer->setText(test);
}

Но Док виджет остается пустой (то есть текст не рисуется) при выполнении условия в ветвлении и посылки сигнала. Не могли бы пожалуйсто объяснить почему?

PS: Еще не очень хорошо разобрался с механизмом cигналов и слотов и не могу понять как определить метод в который нужно писать ф-ию  connect (если ,например, указатели на объекты присутсвуют в нескольких методах - какой принцип выбора?)

За ранее благодарен.


Название: Re: Не удается поймать сигнал
Отправлено: Пантер от Января 19, 2012, 15:34
У слота должно быть не больше параметров, чем у сигнала.


Название: Re: Не удается поймать сигнал
Отправлено: GreatSnake от Января 19, 2012, 15:36
Измени слот:
Код
C++ (Qt)
void MainWindow::drawTerminalViewer () {
 editorScene *_editor = qobject_class< editorScene* >( sender() );
 QString test = "Index_change!";
 terminal_viewer->setText(test);
}


Название: Re: Не удается поймать сигнал
Отправлено: kambala от Января 19, 2012, 15:37
у слота не может быть параметров больше, чем у сигнала.
- вариант 1:
Код
C++ (Qt)
connect(editor, SIGNAL(changeCurrentIndex(editorScene*)), this, SLOT(drawTerminalViewer(editorScene*)));
а в эдиторе:
Код
C++ (Qt)
emit changeCurrentIndex(this);
- вариант 2 (если эдитор существует всего один):
Код
C++ (Qt)
connect(editor, SIGNAL(changeCurrentIndex()), this, SLOT(drawTerminalViewer()));
...
void MainWindow::drawTerminalViewer () {
 QString test = "Index_change!";
 terminal_viewer->setText(test);
 // дальше используй своё поле класса editor
}
- вариант 3 (упрощение варианта 1): см. пост GreatSnake


Название: Re: Не удается поймать сигнал
Отправлено: GreatSnake от Января 19, 2012, 15:40
2 kambala
1-й вариант избыточный, т.к. есть QObject::sender().


Название: Re: Не удается поймать сигнал
Отправлено: Disa от Января 19, 2012, 15:53
Спасибо за оперативные ответы! Заработало


Название: Re: Не удается поймать сигнал
Отправлено: SASA от Января 20, 2012, 10:01
2 kambala
1-й вариант избыточный, т.к. есть QObject::sender().
QObject::sender() редко использует настоящий джедай.
Вариант первый более правильным вижу я.