Как работает 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;
}
на