После моего поста здесь: Ассоциируйте сигнал и слот с 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
работает ? Я не очень понимаю, с чем связываться 🙁
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);
Таким образом, всякий раз, когда вы нажимаете кнопку, mapped(QWidget *)
Сигнал маппера излучается, содержащий виджет в качестве параметра.
Сначала я объясню вам, как QSignalMapper
работает. Тогда я объясню вам, почему вам это не нужно.
Как QSignalMapper
работает:
Создать с QSignalMapper
, Предположим, что вы хотите присвоить целочисленное значение каждому флажку, поэтому каждый раз, когда вы нажимаете на любой флажок, вы получите сигнал с назначенным ему целочисленным значением.
Подключите сигнал картографа к вашему слоту, который вы реализуете:
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;
}
sender()
функция от QObject
, который вы наследуете, так что у вас есть доступ к нему.
int linge
(это номер строки, верно?) — когда вы создаете флажки, вы можете хранить указатели на эти флажки в QList
Поле класса и используйте его из функции слота, выясните, какая это строка, например:В объявлении класса:
private:
QList<QCheckBox*> checkboxes;
При создании флажков:
QCheckBox* cb = new QCheckBox();
checkboxes << cb;
В вашем слоте функция:
void supervision::yourSlot()
{
QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
if (!pCheckBox) // this is just a safety check
return;
int linge = checkboxes.indexOf(pCheckBox);
}
Если вы хотите, вы можете пропустить это QList
и использовать QSignalMapper
и назначить строки для флажков, используя маппер. Это просто вопрос того, что вы предпочитаете.