Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Июль 07, 2008, 13:01



Название: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 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? Что делаю не так?


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


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: Karl-Philipp от Июль 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.)

по-моему из слота нужно убрать переменную-ссылку.


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: Mikhail от Июль 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 указано имя параметра. Это не годится.


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 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();
}

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


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: Karl-Philipp от Июль 07, 2008, 14:59
>> Вот и все впринципе. При компилсяции ошибок и варнингов нет.

Мистика! :)
А можно прикрепить упрощенный вариант Вашего проекта?


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 07, 2008, 15:07
>> Вот и все впринципе. При компилсяции ошибок и варнингов нет.

Мистика! :)
А можно прикрепить упрощенный вариант Вашего проекта?

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


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: pastor от Июль 07, 2008, 15:08
Вот и все впринципе. При компилсяции ошибок и варнингов нет.

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

ЗЫ: Присоединяюсь к посту  Zmeishe по поводу имен параметров в коннекте. Это одна из причин неработоспособности слота


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 07, 2008, 15:38
Вот, упростил донельзя. Пробовал по разному объявлять коннект, рабочего объявления не нащупал.

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

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


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 07, 2008, 16:32
О, кажись понял, ща попробую. Видимо не перехватывается из-за того что метод recordview_select() объявлен не как слот... Он у меня раньше обычной функцией был...

UPD Не, всеравно не работает.


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: Karl-Philipp от Июль 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 ) 

 :P


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: pastor от Июль 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);

И о чудо! Все работает ;)


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 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?
 


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: pastor от Июль 07, 2008, 16:49
Вопрос: Почему при компиляции, если нужного лота нету, нет никаких оповещений? Как сделать чтоб предупреждения были? Крутить moc?

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


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 07, 2008, 16:51

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

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

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


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 07, 2008, 16:53
В общем, стало работать. Всем, кто помогал - большое спасибо!


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: pastor от Июль 07, 2008, 16:54
Я ж грю, что изначально было два параметра при объявлении коннектора (коннектор был объявлен правильно). И такого сообщения в консоли небыло. Потом стал экспериментировать т.к. мне тут сказали что параметры сигнала и слота должны быть идентичными (хотя в доке написано что необязательно). А проблема была в том, что то, что стало слотом, ранее было просто методом, а я забыл перенести объявление в секцию слотов.

Изначально уже была ошибка на которую указал Zmeishe в своем первом посте:

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


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: ритт от Июль 07, 2008, 17:06
если бы коннектор изначально был объявлен правильно, ты бы не создавал эту ветку
предлагаю перенести в "кандидаты"


Название: Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
Отправлено: xintrea от Июль 07, 2008, 17:10
Чиорт, вы правы, это были разные ошипки.

Object::connect: No such signal QItemSelectionModel::currentRowChanged(QModelIndex)
Object::connect:  (receiver name: 'MainWindow')

Object::connect: No such slot mainwindow::recordview_select(QModelIndex &index)
Object::connect:  (receiver name: 'MainWindow')