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