У меня есть модель данных, в которой я хочу, чтобы другие объекты могли следить за обновлениями, но я не хочу давать кому-либо контроль над сигналом обновления сам. Я придумал что-то, что имеет смысл для меня концептуально, но, похоже, это не работает. Мне интересно, может ли кто-нибудь объяснить, почему я никогда не получу его на работу, или если мне не хватает чего-то, что могло бы сделать эту работу. Фактически у меня есть класс 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() это имя теряет смысл.
Строго говоря, частные сигналы невозможно, так как система мета вызова Qt не уважает областей с одной стороны, и потому, что 'signals' это определить для' protected' на другой , – Lol4t0
от «но я не хочу никому контролировать сам сигнал обновления». Предполагаю, вы хотите сказать, что не хотите выставлять адрес объекта, который генерирует сигнал? – Jay
@Jay Мое намерение состоит в том, чтобы держать модель строго ответственной за отправку уведомлений об изменениях. Кодовая база, в которой я работаю, может быть описана как шлейф сигнала/слота, и я чувствую, что предотвращение модели вызова-> updateHandles() поможет заставить нас быть более преднамеренными с сигналами/слотами. – JeffCharter