Сначала я объясню вам, как работает QSignalMapper
. Тогда я объясню вам, почему вам это не нужно.
Как работает QSignalMapper
:
Создайте QSignalMapper
. Предположим, что вы хотите присвоить целочисленное значение каждому флажку, поэтому каждый раз, когда вы нажимаете на любой флажок, вы будете получать сигнал с назначенным ему целочисленным значением.
Подключите сигнал картографа к вашему SLOT, который вы будете реализовывать:
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
и назначать строки флажкам с помощью картографа. Это просто вопрос того, что вы предпочитаете.
person
Googie
schedule
17.06.2014
QSignalMapper
? какая-то конкретная причина? это можно легко сделать при прямом подключении - person Rakib   schedule 17.06.2014QSignalMapper
, вот хороший пример для ты для начала. - person Tay2510   schedule 17.06.2014QSignalMapper
шаг за шагом. Вам просто нужно размышлять об этом, и это требует времени. Я думаю, что вы слишком торопитесь с решением этой проблемы; это не имеет ничего общего с глупостью или нет. - person Tay2510   schedule 17.06.2014