Russian Qt Forum
Ноябрь 24, 2024, 07:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Не удается поймать сигнал  (Прочитано 4016 раз)
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 (если ,например, указатели на объекты присутсвуют в нескольких методах - какой принцип выбора?)

За ранее благодарен.
« Последнее редактирование: Январь 19, 2012, 15:53 от Disa » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 19, 2012, 15:34 »

У слота должно быть не больше параметров, чем у сигнала.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Январь 19, 2012, 15:36 »

Измени слот:
Код
C++ (Qt)
void MainWindow::drawTerminalViewer () {
 editorScene *_editor = qobject_class< editorScene* >( sender() );
 QString test = "Index_change!";
 terminal_viewer->setText(test);
}
Записан

Qt 5.11/4.8.7 (X11/Win)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Январь 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
« Последнее редактирование: Январь 19, 2012, 15:39 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Январь 19, 2012, 15:40 »

2 kambala
1-й вариант избыточный, т.к. есть QObject::sender().
Записан

Qt 5.11/4.8.7 (X11/Win)
Disa
Гость
« Ответ #5 : Январь 19, 2012, 15:53 »

Спасибо за оперативные ответы! Заработало
Записан
SASA
Гость
« Ответ #6 : Январь 20, 2012, 10:01 »

2 kambala
1-й вариант избыточный, т.к. есть QObject::sender().
QObject::sender() редко использует настоящий джедай.
Вариант первый более правильным вижу я.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 23.