Здравствуйте!
Возник вопрос и вообще по C и по программе на Qt.
Если есть массив указателей на некоторые функции, тоже определённых мной в программе,
то при вызове функции как элемент массива есть ли возможность внутри неё определить
её индекс в массиве её указателя?
В Qt есть система сигналов и слотов. Предположим, есть массив указателей на элемент
типа QTcpServer, это несущественно, некоторые его сигналы соединены со слотами.
Предположим, у всех экземпляров одноимённые сигналы, например, connected, соединены
с одним и тем же слотом в программе. Может ли этот слот узнать, какой элемент массива
указателей его вызвал?
Пётр.
определить индекс
В Qt есть система сигналов и слотов. Предположим, есть массив указателей на элемент
типа QTcpServer, это несущественно, некоторые его сигналы соединены со слотами.
Предположим, у всех экземпляров одноимённые сигналы, например, connected, соединены
с одним и тем же слотом в программе. Может ли этот слот узнать, какой элемент массива
указателей его вызвал?
Была похожая проблема в Qt.
Кастыль. При создании QTcpServer устанавливаешь имя (setObjectName).
Переопределяешь класс и вместе с сигналом выносишь ObjectName (QString). Ну или в слоте QObject::sender()->objectName();
[quote="Peter"]В Qt есть система сигналов и слотов. Предположим, есть массив указателей на элемент
типа QTcpServer, это несущественно, некоторые его сигналы соединены со слотами.
Предположим, у всех экземпляров одноимённые сигналы, например, connected, соединены
с одним и тем же слотом в программе. Может ли этот слот узнать, какой элемент массива
указателей его вызвал?
Была похожая проблема в Qt.
Кастыль. При создании QTcpServer устанавливаешь имя (setObjectName).
Переопределяешь класс и вместе с сигналом выносишь ObjectName (QString). Ну или в слоте QObject::sender()->objectName();[/quote]
Благодарю за совет. Я однажды уже искал это в Qt, кажется, видел этот sender, но пробовать не стал.
Точно уже не помню, почему. Теперь, возможно, попробую.
А что значит "переопределить класс?" Создать производный от QTcpServer? setObjectName ведь и так есть?
Пётр.
Создать производный от QTcpServer?
Да
setObjectName ведь и так есть?
А сигнала который бы высылал ObjectName+нужные данные, нету.
[quote="Peter"]Создать производный от QTcpServer?
Да
setObjectName ведь и так есть?
А сигнала который бы высылал ObjectName+нужные данные, нету.[/quote]
Понятно, благодарю за ответ. Возможно, я тогда и не захотел создавать производный
класс. Но теперь мне надо будет иметь в программе 8 экземпляров QTcpServer,
так что проще будет создать производный класс, чем плодить копии подпрограмм
для связи с серверами.
Пётр.
Оказалось, что не надо создавать производный класс для объекта, чтобы узнать,
какой из экземпляров послал сигнал. Достаточно в том классе, в котором создаются
эти объекты, переопределить sender. Например, у меня экземпляры QTcpServer
создаются в классе Camera_udp, в его h-файл я поместил объявление
private:
QObject *udp_sender();определённый в cpp-файле как
QObject *Camera_udp::udp_sender(){return sender();}каждому экземпляру QTcpServer назначено имя с помощью setObjetcName(QString),
в слот, соединённый с сигналом newConnection(), вставлены строки
QObject *po;
po=udp_sender();
тогда
po->objectName();возвращает имя, назначенное оправителю сигнала.
Т.е. можно и не приводить po к QTcpServer*.
Пётр.
нет.Может ли этот слот узнать, какой элемент массива
указателей его вызвал?