Я новичок в Qt и застрял в сигнальном/слотном механизме. У меня есть панель инструментов с несколькими кнопками инструментов, каждая из которых связана с некоторым виджетами. Задача состоит в том, чтобы показать соответствующий виджет, когда нажата кнопка инструмента. Я хочу написать один слот, который будет обрабатывать ассоциации, но я не могу понять, как отличить, какая кнопка запускает сигнал. Кажется, что нажали и toggled сигналы QToolButton принимают только слоты без аргументов и не сохраняют информацию об их эмиттере. Я могу подкласса QtoolButton и поднять событие CLR с информацией об отправителе события на каждом нажав или toggled Излучение сигнала, но должен быть более простой способ делать то, что я хочу. Вы можете мне помочь?Qt Jambi (Qt4Dotnet): отличительные излучатели сигнала в слоте
1
A
ответ
1
В вашем слоте вы можете вызвать функцию sender()
, которая вернет указатель на объект, который излучал сигнал (если это было ... помните, вы можете вызывать слоты так же, как функцию) , Это быстрый, относительно простой и неряшливый способ. Однако он разрушает инкапсуляцию.
Немного лучший способ обеспечить механизм нумерации кнопок и использовать QSignalMapper
для сопоставления отдельных кнопок в один сигнал, который содержит int для кнопки, на которую была нажата кнопка.
Это в C++ (который я больше знакомы с):
QSignalMapper *mapper = new QSignalMapper(this);
connect(mapper, SIGNAL(mapped(int)), SLOT(MyFancyFunction(int)));
// Do this for each button:
mapper->connect(button1, SIGNAL(clicked()), SLOT(map()));
mapper->setMapping(button1, FIRST_TOOL)
Тогда:
void MyFancyFunction(int option)
{
switch (option)
{
case FIRST_TOOL: // do whatever...
}
}