LinuxForum.Fans
Тема

определить индекс

Автор: Peter 7 сообщений 1888 просмотров
#373303

Здравствуйте!

Возник вопрос и вообще по C и по программе на Qt.
Если есть массив указателей на некоторые функции, тоже определённых мной в программе,
то при вызове функции как элемент массива есть ли возможность внутри неё определить
её индекс в массиве её указателя?

В Qt есть система сигналов и слотов. Предположим, есть массив указателей на элемент
типа QTcpServer, это несущественно, некоторые его сигналы соединены со слотами.
Предположим, у всех экземпляров одноимённые сигналы, например, connected, соединены
с одним и тем же слотом в программе. Может ли этот слот узнать, какой элемент массива
указателей его вызвал?

Пётр.

#373314
"Peter" написал:
В Qt есть система сигналов и слотов. Предположим, есть массив указателей на элемент
типа QTcpServer, это несущественно, некоторые его сигналы соединены со слотами.
Предположим, у всех экземпляров одноимённые сигналы, например, connected, соединены
с одним и тем же слотом в программе. Может ли этот слот узнать, какой элемент массива
указателей его вызвал?

Была похожая проблема в Qt.
Кастыль. При создании QTcpServer устанавливаешь имя (setObjectName).
Переопределяешь класс и вместе с сигналом выносишь ObjectName (QString). Ну или в слоте QObject::sender()->objectName();

#373328
marikk написал:
[quote="Peter"]В Qt есть система сигналов и слотов. Предположим, есть массив указателей на элемент
типа QTcpServer, это несущественно, некоторые его сигналы соединены со слотами.
Предположим, у всех экземпляров одноимённые сигналы, например, connected, соединены
с одним и тем же слотом в программе. Может ли этот слот узнать, какой элемент массива
указателей его вызвал?

Была похожая проблема в Qt.
Кастыль. При создании QTcpServer устанавливаешь имя (setObjectName).
Переопределяешь класс и вместе с сигналом выносишь ObjectName (QString). Ну или в слоте QObject::sender()->objectName();[/quote]
Благодарю за совет. Я однажды уже искал это в Qt, кажется, видел этот sender, но пробовать не стал.
Точно уже не помню, почему. Теперь, возможно, попробую.
А что значит "переопределить класс?" Создать производный от QTcpServer? setObjectName ведь и так есть?


Пётр.

#373329
"Peter" написал:
Создать производный от QTcpServer?

Да

"Peter" написал:
setObjectName ведь и так есть?

А сигнала который бы высылал ObjectName+нужные данные, нету.

#373364
marikk написал:
[quote="Peter"]Создать производный от QTcpServer?

Да

"Peter" написал:
setObjectName ведь и так есть?

А сигнала который бы высылал ObjectName+нужные данные, нету.[/quote]
Понятно, благодарю за ответ. Возможно, я тогда и не захотел создавать производный
класс. Но теперь мне надо будет иметь в программе 8 экземпляров QTcpServer,
так что проще будет создать производный класс, чем плодить копии подпрограмм
для связи с серверами.

Пётр.

#373716

Оказалось, что не надо создавать производный класс для объекта, чтобы узнать,
какой из экземпляров послал сигнал. Достаточно в том классе, в котором создаются
эти объекты, переопределить sender. Например, у меня экземпляры QTcpServer
создаются в классе Camera_udp, в его h-файл я поместил объявление

text

private:
QObject *udp_sender();

определённый в cpp-файле как

text
QObject *Camera_udp::udp_sender(){return sender();}

каждому экземпляру QTcpServer назначено имя с помощью setObjetcName(QString),
в слот, соединённый с сигналом newConnection(), вставлены строки

text

QObject *po;
 po=udp_sender();

тогда

text
po->objectName();

возвращает имя, назначенное оправителю сигнала.
Т.е. можно и не приводить po к QTcpServer*.

Пётр.

#373840

"Peter" написал:
Может ли этот слот узнать, какой элемент массива
указателей его вызвал?
нет.
Войдите или зарегистрируйтесь, чтобы ответить.