Qt Jambi (Qt4Dotnet): различение излучателей сигнала в слоте - PullRequest
1 голос
/ 16 июля 2009

Я новичок в Qt и застрял в механизме сигнал / слот. У меня есть панель инструментов с несколькими кнопками инструментов, каждая из которых связана с каким-то виджетом. Задача - показать соответствующий виджет при нажатии кнопки инструмента. Я хочу написать один слот, который будет обрабатывать ассоциации, но я не могу понять, как определить, какая кнопка активировала сигнал. Похоже, что clicked и переключили сигналы QToolButton , принимающие только слоты без аргументов и не сохраняющие информацию об их эмиттере. Я могу создать подкласс QtoolButton и вызвать событие CLR с информацией об отправителе события для каждого нажатого или переключенного сигнала, но должен быть более простой способ сделать Я хочу. Вы можете мне помочь?

1 Ответ

1 голос
/ 16 июля 2009

В вашем слоте вы должны иметь возможность вызывать функцию 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...
    }
}
...