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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигналы-Слоты не работают  (Прочитано 8482 раз)
Dmitry Konnov
Гость
« : Ноябрь 30, 2005, 15:56 »

Установил 3.2.3

Открыл пример listviews в папке examples

Попытался добавить свой слот и подключить его сигналу.
Сделал все по аналогу уже имеющихся слотов.

Но мой слот не активируется при данном сигнале.

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

Все компилится но слоты не работают.

Дмитрий.
Записан
Dendy
Гость
« Ответ #1 : Ноябрь 30, 2005, 16:01 »

Код в студію!  Веселый  Знов двадцять п'ять (тьху... щось не римується  Показает язык ). Ті самі помилки. Ось хіба заради чого треба спочатку читати книги!
Записан
Dmitry Konnov
Гость
« Ответ #2 : Ноябрь 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
Гость
« Ответ #3 : Ноябрь 30, 2005, 16:35 »

Ось тепер все зрозуміло. Ти невірно з'єднуєш сигнал зі слотом.

Невірно:

Код:
connect(folders, SIGNAL( selectionChanged( QListViewItem * item )), 
this, SLOT( slotFolderChanged( QListViewItem * item ) ) );


Вірно:
Код:
connect(folders, SIGNAL( selectionChanged( QListViewItem * )), 
this, SLOT( slotFolderChanged( QListViewItem * ) ) );


Сігнатура сигналів та слотів повинна бути без імен параметрів.
Доречі, функція connect( ... ) повертає false якщо з'єднання не відбулося. А у стандартному потоці помилок (у студії в Output) ти побачиш підробиці помилки (немає такого сигнала, чи слоту, або нульові вказівачі, або ще щось).
Записан
Dmitry Konnov
Гость
« Ответ #4 : Ноябрь 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
Гость
« Ответ #5 : Ноябрь 30, 2005, 17:01 »

Якщо слот не працює - дивись чи виконався connect()! Не треба писати про усі помилки, які можна виправити самому! Дивіться що пишеться в Output.

Код:
SLOT( slotExpandChanged( QListViewItem* ) )

Код:
void slotExpand(QListViewItem *item);


Це вже знущання...  :cry:
Записан
Dmitry Konnov
Гость
« Ответ #6 : Ноябрь 30, 2005, 17:13 »

Исправил, Брат.

и так пробовал и так.
Всеравно expanded не вызывается.

Может это QlistView сам глючит?
Записан
Dendy
Гость
« Ответ #7 : Ноябрь 30, 2005, 17:16 »

Неможе там нічого глючити. Шукай помилку в себе. Читай мануали.
Записан
Dmitry Konnov
Гость
« Ответ #8 : Ноябрь 30, 2005, 18:18 »

Нет брат
что -то не так.

все слоты которые я определяю не работают.

сделал элементарный слот без параметров
и прицепил его к таймеру.
как в примере hello.

не вызывается.

Может надо еще чтото запускать Qt- шное?
Записан
Dendy
Гость
« Ответ #9 : Ноябрь 30, 2005, 18:35 »

Треба дивитися код.
Записан
Dmitry Konnov
Гость
« Ответ #10 : Ноябрь 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
Гость
« Ответ #11 : Ноябрь 30, 2005, 20:02 »

1. Дивись що повертає функція connect().

2. Не треба писати QObject::connect(), коли конектиш з тіла класа, що приймає сигнал, треба просто connect().

3. Чи ти не забув вписати Q_OBJECT у об'явленні класу?

4. Чи ти не забув увімкнути головний цикл exec()?
Записан
Dmitry Konnov
Гость
« Ответ #12 : Ноябрь 30, 2005, 21:44 »

Благодаря Ви Брат за поддержку.
Зробило.

Собрал новый проект из самого элементарного примера,
hello.

Думаю что там не работало потому что ListWiews наследовался от QSplitter.

Глянь в пример listviews.

И еще.
Событие expanded вызывается только если слот объявлен
в секции
protected slots:

Дмитрий.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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