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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигнал-Слот  (Прочитано 7473 раз)
simark1979
Гость
« : Декабрь 26, 2009, 00:11 »

Есть вот такой класс, следит за изменениями в каталоге
Вроде имеется в нем слот directoryChanged
но connect его не видит, хотя вызвать его через emit удается.


Результат работы:
Object::connect: No such slot QObject::slot_directoryChanged(const QString &) in gsm_handler.cpp:9
Directory changed:  "hand emitted"



Что не так?


#include "gsm_handler.h"
#include <QDebug>

gsm_handler::gsm_handler()
{
    qDebug() << "Constructor gsm_handler";
    QFileSystemWatcher *FileSystemWatcher = new QFileSystemWatcher();

    connect(FileSystemWatcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(slot_directoryChanged(const QString &)));
    FileSystemWatcher->addPath("/sms");

    emit slot_directoryChanged("hand emitted");
}

void gsm_handler::slot_directoryChanged(const QString & path){
    qDebug() << "Directory changed: " << path;
}

Записан
BRE
Гость
« Ответ #1 : Декабрь 26, 2009, 00:21 »

Покажи, что в gsm_handler.h.
Записан
Dendy
Гость
« Ответ #2 : Декабрь 26, 2009, 00:28 »

Я даже знаю что - нет макроса Q_OBJECT. Поэтому SLOT() берётся из родительского класса - из QObject. А там, понятно, такого слота нет.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Декабрь 26, 2009, 01:25 »

И вот это тоже косячёк:
>>emit slot_directoryChanged("hand emitted");
слоты не посылаются, их просто вызывают как обычные функции.
Записан

Юра.
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Декабрь 26, 2009, 17:55 »

Я даже знаю что - нет макроса Q_OBJECT. Поэтому SLOT() берётся из родительского класса - из QObject. А там, понятно, такого слота нет.

И второй вариант - Q_OBJECT всё-таки добавили, но qmake заново не вызвали.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Декабрь 26, 2009, 18:54 »

И второй вариант - Q_OBJECT всё-таки добавили, но qmake заново не вызвали.

Тогда бы приложение не слинковалось
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
simark1979
Гость
« Ответ #6 : Декабрь 27, 2009, 19:37 »

А вот
gsm_handler.h.


#include <QObject>
#include <QFileSystemWatcher>

class gsm_handler : public QObject
{
public:
    gsm_handler();
    ~gsm_handler();
protected slots:
    void slot_directoryChanged(const QString & path);
};

Записан
BRE
Гость
« Ответ #7 : Декабрь 27, 2009, 19:53 »

Забыл Q_OBJECT:
Код
C++ (Qt)
class gsm_handler : public QObject
{
   Q_OBJECT
public:
   gsm_handler();
 

и не забудь сделать qmake.
Записан
simark1979
Гость
« Ответ #8 : Декабрь 27, 2009, 21:08 »

Спасибо. Мужики. Я только начинаю.
Извиняете за тупые вопросы.  Улыбающийся
Я не забыл, я не знал  Злой
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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