2009-07-16 5 views
1

Я новичок в Qt и застрял в сигнальном/слотном механизме. У меня есть панель инструментов с несколькими кнопками инструментов, каждая из которых связана с некоторым виджетами. Задача состоит в том, чтобы показать соответствующий виджет, когда нажата кнопка инструмента. Я хочу написать один слот, который будет обрабатывать ассоциации, но я не могу понять, как отличить, какая кнопка запускает сигнал. Кажется, что нажали и toggled сигналы QToolButton принимают только слоты без аргументов и не сохраняют информацию об их эмиттере. Я могу подкласса QtoolButton и поднять событие CLR с информацией об отправителе события на каждом нажав или toggled Излучение сигнала, но должен быть более простой способ делать то, что я хочу. Вы можете мне помочь?Qt Jambi (Qt4Dotnet): отличительные излучатели сигнала в слоте

ответ

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... 
    } 
}