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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не ловится сигнал currentRowChanged у selectionModel. Почему?  (Прочитано 14137 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Июль 07, 2008, 13:01 »

Здравствуйте!

Долблюсь вот с перехватом движения "засветки" курсорными клавишами в QListView. То есть, нужно вызывать функцию в момент, когда синенькая "засветка" переместилась на другую строку.

Делаю так. У меня есть класс mainwindow, в инициализации которого есть такой код

Код:
 // Загрузка модели таблицы записей в представление для QListView
 recordview->setModel(tabmod);
 
 // Поддержка обработки движения стрелок в таблице записей
 // Обяательно размещать после загрузки модели, т.к.
 // this signal will not be emitted when the item model is reset.
 connect(recordview->selectionModel(),
         SIGNAL(currentRowChanged (const QModelIndex&, const QModelIndex&)),
         this, 
         SLOT(recordview_select(const QModelIndex &index)));

Ну и дело в том, что при движении стрелками сигнал не ловится, вставил дебажный вывод в консоль в метод recordview_select(), и вижу что он вообще не вызывается.

Думал, что может быть объект приемника нужно указывать не this, но у меня там же нормально срабатывает перехват других сигналов, типа

Код:
     a = new QAction(tr("&Print..."), this);
     a->setShortcut(QKeySequence::Print);
     connect(a, SIGNAL(triggered()), this, SLOT(filePrint()));
     menu->addAction(a);

Как же отловить сигнал currentRowChanged для selectionModel объекта типа QListView? Что делаю не так?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Zmeishe
Гость
« Ответ #1 : Июль 07, 2008, 13:48 »

Цитировать
Код:
connect(recordview->selectionModel(), 
         SIGNAL(currentRowChanged (const QModelIndex&, const QModelIndex&)),
         this, 
         SLOT(recordview_select(const QModelIndex &index)));
Количество параметров и их типы в слоте должны точь в точь СООТВЕТСТВОВАТЬ количеству параметров и их типам в сигнале.
А имена параметров в connect/disconnect указывать НЕ НУЖНО.
Стопудово он тебе в дебаг пишет ругань типа немогу соединить несоединяемое и впихнуть невпихуемое.
« Последнее редактирование: Июль 07, 2008, 13:54 от Zmeishe » Записан
Karl-Philipp
Гость
« Ответ #2 : Июль 07, 2008, 13:55 »

Цитировать
Код:
connect(recordview->selectionModel(), 
         SIGNAL(currentRowChanged (const QModelIndex&, const QModelIndex&)),
         this, 
         SLOT(recordview_select(const QModelIndex &index)));
Количество параметров и их типы в слоте должны точь в точь соответствовать количеству параметров и их типам в сигнале.
Стопудово он тебе в дебаг пишет ругань типа немогу соединить несоединяемое и впихнуть невпихуемое.

может я ошибаюсь, но вот что вычитал в Assistant:

Цитировать
The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)

по-моему из слота нужно убрать переменную-ссылку.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 586


Просмотр профиля
« Ответ #3 : Июль 07, 2008, 14:01 »

Цитировать
Код:
connect(recordview->selectionModel(), 
         SIGNAL(currentRowChanged (const QModelIndex&, const QModelIndex&)),
         this, 
         SLOT(recordview_select(const QModelIndex &index)));
Количество параметров и их типы в слоте должны точь в точь соответствовать количеству параметров и их типам в сигнале.
Стопудово он тебе в дебаг пишет ругань типа немогу соединить несоединяемое и впихнуть невпихуемое.

Zmeishe

Ну вот и неправда твоя. Количество параметров в слоте может быть и меньше количества параметров в сигнале. Про совпадение типов это точно.

xintrea

Возникает вопрос:  ты сам представляешь что хочешь сделать?
Для ответа мало информации.
recordview ?
tabmod ?
...
...
Одни вопросы

Да, в коннесте не указывают имена параметров, а только их типы.
У тебя в слоте функции connect указано имя параметра. Это не годится.
« Последнее редактирование: Июль 07, 2008, 15:31 от Mikhail » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Июль 07, 2008, 14:27 »

Возникает вопрос:  ты сам представляешь что хочешь сделать?
Для ответа мало информации.
recordview ?
tabmod ?
...
...
Одни вопросы

Все сделано примитивно.

recordview - это объект класса QListView, размещенный на форме окна в QtDesigner.
tabmod - это модель данных, которую я вставляю в данный QListView (это видно по коду).

Код загрузки модели в recordview и создание связки сигнал-слот размещен в конструкторе объекта mainwindow класса QMainWindow. Первая команда конструктора -  setupUi(this);, затем код первого поста.

Создание окна происходит в main.cpp кодом

Код:
int main(int argc, char ** argv)
{
  QApplication app( argc, argv );
  mainwindow win;
  win.show();
  return app.exec();
}

Вот и все впринципе. При компилсяции ошибок и варнингов нет.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Karl-Philipp
Гость
« Ответ #5 : Июль 07, 2008, 14:59 »

>> Вот и все впринципе. При компилсяции ошибок и варнингов нет.

Мистика! Улыбающийся
А можно прикрепить упрощенный вариант Вашего проекта?
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Июль 07, 2008, 15:07 »

>> Вот и все впринципе. При компилсяции ошибок и варнингов нет.

Мистика! Улыбающийся
А можно прикрепить упрощенный вариант Вашего проекта?

Щас попробую какнить упростить...
Записан

Собираю информацию по крупицам
http://webhamster.ru
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Июль 07, 2008, 15:08 »

Вот и все впринципе. При компилсяции ошибок и варнингов нет.

А призапуске что на консоль пишет? Что возвращает connect?

ЗЫ: Присоединяюсь к посту  Zmeishe по поводу имен параметров в коннекте. Это одна из причин неработоспособности слота
« Последнее редактирование: Июль 07, 2008, 15:11 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #8 : Июль 07, 2008, 15:38 »

Вот, упростил донельзя. Пробовал по разному объявлять коннект, рабочего объявления не нащупал.

По примеру - при движении засветки в консоль должны выводиться строки In function recordview_select().

Архив проекта приаттачен.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #9 : Июль 07, 2008, 16:32 »

О, кажись понял, ща попробую. Видимо не перехватывается из-за того что метод recordview_select() объявлен не как слот... Он у меня раньше обычной функцией был...

UPD Не, всеравно не работает.
« Последнее редактирование: Июль 07, 2008, 16:34 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Karl-Philipp
Гость
« Ответ #10 : Июль 07, 2008, 16:33 »

xintrea, попробовал откомпилировать проект, сразу выдало вот такое:
Цитировать
Start MyTetra v.0.17
Object::connect: No such slot mainwindow::recordview_select(QModelIndex)
...
идем в реализацию и обнаруживаем, что там есть только метод
Цитировать
private:
   void recordview_select(const QModelIndex &index);

};

дальше:

Цитировать
connect(recordview->selectionModel(),
         SIGNAL(currentRowChanged (const QModelIndex&)),
         this, 
         SLOT(recordview_select(const QModelIndex&)));

а на самом деле синала с такими параметрами нет, что подтверждается руганью ...
есть сигнал с такими параметрами:

Цитировать
void QItemSelectionModel::currentRowChanged ( const QModelIndex & current, const QModelIndex & previous ) 

 Показает язык
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Июль 07, 2008, 16:39 »

Вот, упростил донельзя. Пробовал по разному объявлять коннект, рабочего объявления не нащупал.

По примеру - при движении засветки в консоль должны выводиться строки In function recordview_select().

Архив проекта приаттачен.

Пример это хорошо, но вот блин непонятно для кого были написаны посты выше? Указывали посмотреть на консоль, указывали посмотреть что возвращает метод connect. Непонятно вобщем зачем тогда форум если не читать что пишут...
А ведь на консоли белым по мятому написано:

Цитировать
Object::connect: No such signal QItemSelectionModel::currentRowChanged(QModelIndex)
Object::connect:  (receiver name: 'MainWindow')

Смотрим в ассистант, и о мистика! Действительно такого сигнала нет. Заменяем на правильный сигнал (получаем код из первого поста)

Код:
connect(recordview->selectionModel(), 
         SIGNAL(currentRowChanged (const QModelIndex &, const QModelIndex &)),
         this,  
         SLOT(recordview_select(const QModelIndex&)));

Компилим, запускам, смотрим на консоль и... нет такого слота:

Цитировать
Object::connect: No such slot mainwindow::recordview_select(QModelIndex)
Object::connect:  (receiver name: 'MainWindow')

Идем в mainwindow.h и обнаруживаем что это не слот а просто метод. Изменяем:

Код:
private slots:
 void recordview_select(const QModelIndex &index);

И о чудо! Все работает Подмигивающий
« Последнее редактирование: Июль 07, 2008, 16:45 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #12 : Июль 07, 2008, 16:45 »

а на самом деле синала с такими параметрами нет, что подтверждается руганью ...
есть сигнал с такими параметрами:

void QItemSelectionModel::currentRowChanged ( const QModelIndex & current, const QModelIndex & previous )

Ну currentRowChanged (const QModelIndex & current) у меня после экспериментов осталось, пробовал и currentRowChanged ( const QModelIndex & current, const QModelIndex & previous ). Кстати, ругани на данное объявление слота почему-то у меня нет. Только одно предупреждение что параметр внутри функции не используется (он действительно в этом упрощенном примере не используется)

Цитировать
Лог компиляции если один параметр у currentRowChanged() в объявлении слота

Сборка (make)...
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtXml -I/usr/include/qt4/QtXml -I/usr/include/qt4 -Ibuild -Ibuild -o build/mainwindow.o src/mainwindow.cpp
src/mainwindow.cpp:65: предупреждение: unused parameter 'index'
g++  -o bin/qtwinform build/main.o build/mainwindow.o build/moc_mainwindow.o    -L/usr/lib -lQtXml -lQtGui -lQtCore -lpthread


В общем, сделал. Наложились две ошибки - слот описан как обычный метод, и currentRowChanged() надо было прописывать с двумя параметрами.

Вопрос: Почему при компиляции, если нужного лота нету, нет никаких оповещений? Как сделать чтоб предупреждения были? Крутить moc?
 
Записан

Собираю информацию по крупицам
http://webhamster.ru
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #13 : Июль 07, 2008, 16:49 »

Вопрос: Почему при компиляции, если нужного лота нету, нет никаких оповещений? Как сделать чтоб предупреждения были? Крутить moc?

С точки зрения компилятора все ок. Ворниики видны на консоли при запуске приложения (я уже про это писал выше)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #14 : Июль 07, 2008, 16:51 »


Пример это хорошо, но вот блин непонятно для кого были написаны посты выше? Указывали посмотреть на консоль, указывали посмотреть что возвращает метод connect. Непонятно вобщем зачем тогда форум если не читать что пишут...
А ведь на консоли белым по мятому написано:

Цитировать
Object::connect: No such signal QItemSelectionModel::currentRowChanged(QModelIndex)
Object::connect:  (receiver name: 'MainWindow')

Я ж грю, что изначально было два параметра при объявлении коннектора (коннектор был объявлен правильно). И такого сообщения в консоли небыло. Потом стал экспериментировать т.к. мне тут сказали что параметры сигнала и слота должны быть идентичными (хотя в доке написано что необязательно). А проблема была в том, что то, что стало слотом, ранее было просто методом, а я забыл перенести объявление в секцию слотов.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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