Как работает 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 работает ? Я не очень понимаю, с чем связываться 🙁

9

Решение

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 *) Сигнал маппера излучается, содержащий виджет в качестве параметра.

11

Другие решения

Сначала я объясню вам, как 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 и назначить строки для флажков, используя маппер. Это просто вопрос того, что вы предпочитаете.

7

По вопросам рекламы [email protected]