Как работает QSignalMapper?

после моего поста здесь : связать сигнал и слот для qcheckbox создать динамически мне нужно связать :

• сигнал clicked() когда я нажимаю на qCheckBox функции cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)

чтобы сделать это, я должен использовать QSignalMapper, после двух часов попыток понять, как это работает, я не могу иметь хороший результат, вот код, который я делаю, это, очевидно, неправильно:

 QSignalMapper *m_sigmapper = new QSignalMapper(this);
 QObject::connect(pCheckBox, SIGNAL(mapped(QTableWidget*,int, QCheckBox*)), pCheckBox, SIGNAL(clicked()));
 QObject::connect(this, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

 m_sigmapper->setMapping(pCheckBox, (monTab,ligne, pCheckBox));
 QObject::connect(m_sigmapper, SIGNAL(clicked()),this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

можете ли вы объяснить мне, как QSignalMapper работает ? Я не очень поймите, с чем ассоциироваться: (

2 ответов


QSignalMapper класс собирает набор параметров, сигналы и излучает их число, строку или параметры виджета, соответствующий объекту, который послал сигнал. Таким образом, вы можете иметь один, как:

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *)));

для каждой из ваших кнопок вы можете подключить clicked() сигнал map() слот QSignalMapper и добавьте отображение с помощью setMapping, чтобы, когда clicked() сигнализируется с кнопки, сигнал mapped(QWidget *) выделяется:

QPushButton * but = new QPushButton(this);

QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, but);

этот путь когда вы щелкаете a кнопки mapped(QWidget *) излучается сигнал картографа, содержащий виджет в качестве параметра.


сначала я объясню вам, как QSignalMapper строительство. Тогда я объясню тебе, почему он тебе не нужен.

как QSignalMapper работает:

создать s QSignalMapper. Предположим, что вы хотите присвоить целочисленное значение каждому флажку, поэтому каждый раз, когда вы нажимаете на любой флажок, вы получите сигнал с целочисленным значением, назначенным ему.

подключите сигнал mapper к вашему слоту, который вы реализуете:

connect(mapper, SIGNAL(mapped(int)), this, SLOT(yourSlot(int)));

теперь вы можете напишите слот, который будет принимать целочисленный аргумент. Аргумент будет отличаться для каждого флажка, который у вас есть.

пока вы создаете флажки, для каждого флажка вам нужно сделать следующее:

mapper->setMapping(checkBox, integerValueForThisCheckbox);
connect(checkBox, SIGNAL(clicked()), mapper, SLOT(map()));

отныне, каждый раз, когда вы нажимаете на флажок, он будет излучать clicked() сигнал QSignalMapper, который затем сопоставит его с назначенным целочисленным значением и выдаст mapped() сигнал. Вы подключились к этому mapped() сигнал, так yourSlot(int) будет вызываться с правильным целым числом значение.

вместо целых чисел можно назначить QString, QWidget* или QObject* (см. документацию Qt).

это как QSignalMapper работа.

вам это не нужно:

  • на QTableWidget *monTab является единственным объектом, он не меняется. Сохраните его как поле члена класса и используйте его из своей функции слота.
  • на QCheckBox *pCheckBox - вы можете получить его, бросив sender() до QCheckBox*.

как это:

void supervision::yourSlot()
{
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
    if (!pCheckBox) // this is just a safety check
        return;
}

на