Название: Сигналы-Слоты не работают Отправлено: Dmitry Konnov от Ноябрь 30, 2005, 15:56 Установил 3.2.3
Открыл пример listviews в папке examples Попытался добавить свой слот и подключить его сигналу. Сделал все по аналогу уже имеющихся слотов. Но мой слот не активируется при данном сигнале. После того как удалил слот, объявленный в прогамме, перестали работать вообще все слоты. Все компилится но слоты не работают. Дмитрий. Название: Сигналы-Слоты не работают Отправлено: Dendy от Ноябрь 30, 2005, 16:01 Код в студію! :D Знов двадцять п'ять (тьху... щось не римується :P ). Ті самі помилки. Ось хіба заради чого треба спочатку читати книги!
Название: Сигналы-Слоты не работают Отправлено: Dmitry Konnov от Ноябрь 30, 2005, 16:23 Помоги Браток.
class ListViews : public QSplitter { Q_OBJECT public: ListViews( QWidget *parent = 0, const char *name = 0 ); ~ListViews() {} protected: void initFolders(); void initFolder( Folder *folder, unsigned int &count ); void setupFolders(); QListView *messages, *folders; QLabel *message; QPopupMenu* menu; QPtrList<Folder> lstFolders; protected slots: void slotFolderChanged(QListViewItem * i); void slotMessageChanged(); void slotRMB( QListViewItem*, const QPoint &, int ); }; Это класс Лист вьюва. Ты можеж посмотреть в examples/listviews В конструкторе ListViews соединяю сигнал и слот //------------------------------------------------------------------------------- connect(folders, SIGNAL( selectionChanged( QListViewItem * item )), this, SLOT( slotFolderChanged( QListViewItem * item ) ) ); //------------------------------------------------------------------------------- Вот этот слот должен вызываться при выборе ноды в дереве. Ставлю точку прерывания - Но не работает. Вообще все слоты перестали работать. void ListViews::slotFolderChanged(QListViewItem * i) { if ( !i ) return; messages->clear(); message->setText( "" ); FolderListItem *item = ( FolderListItem* )i; for ( Message* msg = item->folder()->firstMessage(); msg; msg = item->folder()->nextMessage() ) (void)new MessageListItem( messages, msg ); } Дмитрий. Название: Сигналы-Слоты не работают Отправлено: Dendy от Ноябрь 30, 2005, 16:35 Ось тепер все зрозуміло. Ти невірно з'єднуєш сигнал зі слотом.
Невірно: Код: connect(folders, SIGNAL( selectionChanged( QListViewItem * item )), Вірно: Код: connect(folders, SIGNAL( selectionChanged( QListViewItem * )), Сігнатура сигналів та слотів повинна бути без імен параметрів. Доречі, функція connect( ... ) повертає false якщо з'єднання не відбулося. А у стандартному потоці помилок (у студії в Output) ти побачиш підробиці помилки (немає такого сигнала, чи слоту, або нульові вказівачі, або ще щось). Название: Сигналы-Слоты не работают Отправлено: Dmitry Konnov от Ноябрь 30, 2005, 16:51 Спасибо.
поправил параметры и слоты заработали. Но слот который я хочу подключить, не работает. Я хочу подключить слот, который будет активироваться когда нода дерева раскрывается. Я полагаю это сигнал expanded Добавил новый слот slotExpand в класс ListViews //--------------------------------------------------------------- protected slots: void slotFolderChanged(QListViewItem * i); void slotMessageChanged(); void slotRMB( QListViewItem*, const QPoint &, int ); void slotExpand(QListViewItem *item); //--------------------------------------------------------------- подключил connect( folders, SIGNAL( expanded( QListViewItem* ) ), this, SLOT( slotExpandChanged( QListViewItem* ) ) ); //--------------------------------------------------------------- вот реализация слота //--------------------------------------------------------------- void ListViews::slotExpand(QListViewItem *item) { int a; a = 0; a++; } //--------------------------------------------------------------- но слот не вызывается. Дмитрий Название: Сигналы-Слоты не работают Отправлено: Dendy от Ноябрь 30, 2005, 17:01 Якщо слот не працює - дивись чи виконався connect()! Не треба писати про усі помилки, які можна виправити самому! Дивіться що пишеться в Output.
Код: SLOT( slotExpandChanged( QListViewItem* ) ) Код: void slotExpand(QListViewItem *item); Це вже знущання... :cry: Название: Сигналы-Слоты не работают Отправлено: Dmitry Konnov от Ноябрь 30, 2005, 17:13 Исправил, Брат.
и так пробовал и так. Всеравно expanded не вызывается. Может это QlistView сам глючит? Название: Сигналы-Слоты не работают Отправлено: Dendy от Ноябрь 30, 2005, 17:16 Неможе там нічого глючити. Шукай помилку в себе. Читай мануали.
Название: Сигналы-Слоты не работают Отправлено: Dmitry Konnov от Ноябрь 30, 2005, 18:18 Нет брат
что -то не так. все слоты которые я определяю не работают. сделал элементарный слот без параметров и прицепил его к таймеру. как в примере hello. не вызывается. Может надо еще чтото запускать Qt- шное? Название: Сигналы-Слоты не работают Отправлено: Dendy от Ноябрь 30, 2005, 18:35 Треба дивитися код.
Название: Сигналы-Слоты не работают Отправлено: Dmitry Konnov от Ноябрь 30, 2005, 19:21 Объявляемо в классе таймер
//-------------------------------------------------------------------- QTimer *timer; private slots: void slotAnimate(); //-------------------------------------------------------------------- регистрируем слот QTimer *timer = new QTimer(this); QObject::connect( timer, SIGNAL(timeout()), SLOT(slotAnimate()) ); timer->start( 40 ); //-------------------------------------------------------------------- void ListViews::slotAnimate() { b = (b + 1); int a; a++; a++; a++; } //-------------------------------------------------------------------- Но не вызывается он всеравно. Открываю пример hello там работае а здесь нет. Название: Сигналы-Слоты не работают Отправлено: Dendy от Ноябрь 30, 2005, 20:02 1. Дивись що повертає функція connect().
2. Не треба писати QObject::connect(), коли конектиш з тіла класа, що приймає сигнал, треба просто connect(). 3. Чи ти не забув вписати Q_OBJECT у об'явленні класу? 4. Чи ти не забув увімкнути головний цикл exec()? Название: Сигналы-Слоты не работают Отправлено: Dmitry Konnov от Ноябрь 30, 2005, 21:44 Благодаря Ви Брат за поддержку.
Зробило. Собрал новый проект из самого элементарного примера, hello. Думаю что там не работало потому что ListWiews наследовался от QSplitter. Глянь в пример listviews. И еще. Событие expanded вызывается только если слот объявлен в секции protected slots: Дмитрий. |