2013-05-10 7 views
1

У меня есть модель данных, в которой я хочу, чтобы другие объекты могли следить за обновлениями, но я не хочу давать кому-либо контроль над сигналом обновления сам. Я придумал что-то, что имеет смысл для меня концептуально, но, похоже, это не работает. Мне интересно, может ли кто-нибудь объяснить, почему я никогда не получу его на работу, или если мне не хватает чего-то, что могло бы сделать эту работу. Фактически у меня есть класс Client (QObject), который имеет произвольный слот и класс Model, у которого есть частный сигнал.Частный сигнал QT

важный код класса Client (публичный SLOT): Код

void client::doUpdate() 
{ 
    std::cout << "HELLO UPDATE" <<std::endl; 
} 

Модель:

void Model::unRegisterForUpdates(const char* qt_slot_handle, QObject* o) 
{ 
    QObject::disconnect (this, SIGNAL(updateHandles()), 
         o, qt_slot_handle); 
} 

void Model::registerForUpdates(const char* qt_slot_handle, QObject* o) 
{ 
    QObject::connect(this, SIGNAL(updateHandles()) 
        , o, qt_slot_handle 
        , Qt::UniqueConnection); 
} 

Главная FUNC:

Model foo; 
client * cl = new client(); 
client * cl2 = new client(); 
std::cout << SLOT(cl->doUpdate()) << std::endl; 
std::cout << SLOT(cl2->doUpdate()) << std::endl; 
foo.registerForUpdates(SLOT(cl->doUpdate()) , cl); 
foo.registerForUpdates(SLOT(cl2->doUpdate()) , cl2); 

Выход:

1cl->doUpdate() 
1cl2->doUpdate() 
Object::connect: No such slot client::cl->doUpdate() in .../main.cpp:14 
Object::connect: No such slot client::cl2->doUpdate() in .../main.cpp:15 

Вероятно, он дойдет до объема интроспекции, которую я могу получить в системе сигналов/слотов. Я не уверен, как интерпретировать сообщение об ошибке соединения. Он сообщает мне, что соединение связано со статической информацией для класса Client, но строка слота указывает конкретное имя экземпляра - мне интересно, если к моменту моего получения в Model :: connectHandle() это имя теряет смысл.

+0

Строго говоря, частные сигналы невозможно, так как система мета вызова Qt не уважает областей с одной стороны, и потому, что 'signals' это определить для' protected' на другой , – Lol4t0

+0

от «но я не хочу никому контролировать сам сигнал обновления». Предполагаю, вы хотите сказать, что не хотите выставлять адрес объекта, который генерирует сигнал? – Jay

+0

@Jay Мое намерение состоит в том, чтобы держать модель строго ответственной за отправку уведомлений об изменениях. Кодовая база, в которой я работаю, может быть описана как шлейф сигнала/слота, и я чувствую, что предотвращение модели вызова-> updateHandles() поможет заставить нас быть более преднамеренными с сигналами/слотами. – JeffCharter

ответ

3

Это простой случай опечатки:

В классе, у вас есть doUpdate() слота.

В основном func, вы передаете onUpdate() в SLOT() макро.

Кроме того, вы не должны включать экземпляр в макрос SLOT(), просто имя слота (и параметры). Точно такой же синтаксис, который вы использовали бы в connect(). Механизм соединения сигнальных интервалов Qt основан на сравнении строк. Другими словами, ваш главный должен сделать это:

foo.registerForUpdates(SLOT(doUpdate()), cl); 
foo.registerForUpdates(SLOT(doUpdate()), cl2); 
+0

Спасибо, что работает. Удивительно, что опечатка может замаскировать. – JeffCharter

+2

Обратите внимание, что Qt 5 имеет новый синтаксис для 'connect()', который позволяет проверять время компиляции, используя старый метод, который полагается на проводку во время выполнения на основе имен строк: http://qt-project.org/wiki/New_Signal_Slot_Syntax –

+2

... и этот синтаксис ('& Sender :: valueChanged') полностью соблюдает правила доступа C++, так как это просто указатель на функцию-член. – MSalters

Смежные вопросы