Передача QString методу класса parent с помощью QSignalMapper
У меня есть родительский класс с его методом для изменения изображения меток на определенных сигналах. Например, когда что-то происходит в QComboBox... (valueChanged, активировано)
class parentClass : public QMainWindow
{
Q_OBJECT
...
public slots:
//this is the slot i want to connect to some signal of
//e.g a combo box to change the picture by passed in string
void changePicture(QString fileName);
Тогда у меня есть этот ребенок:
class childClass : public QObject
{
Q_OBJECT
public:
childClass(parentClass *parent, QTabWidget *tab, QStringList *guards=0);
private:
bool readCombo(QXmlStreamReader *xmlreader);
Теперь внутри readCombo
Я хочу прочитать строку и передать ее, чтобы изменить картинку:
QString imageFileName = xmlreader->attributes().value("image").toString();
QSignalMapper * signalMapper = new QSignalMapper(parent);
//this is just one of many trials to get this working, i hope you get the picture
connect(combo , SIGNAL(activated(int)), parent, SLOT(changePicture(QString *)));
signalMapper->setMapping(combo, imageFileName);
Но это дает мне либо No such Signal
, No such Slot
или в верхнем регистре Incompatiple sender/receiver arguments
Я был бы признателен за некоторую помощь по этому вопросу, так как синтаксис действительно не является интуитивно понятным (imo), и я не могу найти какую-либо хорошую справку, которая работает для моего случая (пробная версия и ошибка много, прежде чем спрашивать)
3 ответа
Хорошо понял:
QString imageFileName = xmlreader->attributes().value("image").toString();
QSignalMapper * signalMapper = new QSignalMapper(parent);
signalMapper->setMapping(combo, imageFileName);
connect(signalMapper, SIGNAL(mapped(QString)), parent, SLOT(changePicture(QString)));
connect( combo, SIGNAL(activated(int)), signalMapper, SLOT(map()) );
Некоторые проблемы с вашим кодом.
- вы действительно не можете подключиться к частному слоту
QObject
- Вы создаете новый маппер сигналов каждый раз, когда звоните
readCombo
который вы не очищаете - в результате чего возникает утечка памяти. - призвание
connect
Несколько раз создает несколько соединений, т. е. вы будете вызывать один и тот же слот несколько раз с одним сигналом.
Из вашего примера кода я вижу, что вы можете решить эту проблему, либо сделав parentClass
слот публичный ИЛИ добавить сигнал в childClass
и подключиться к нему в parentClass
,
Другой вариант - изменить readCombo
как это:
QString imageFileName = xmlreader->attributes().value("image").toString();
parentClass->changePicture(imageFileName);
и ваш родительский класс как
class parentClass : public QMainWindow
{
Q_OBJECT
...
public slots:
//this is the slot i want to connect to some signal of
//e.g a combo box to change the picture by passed in string
void changePicture(QString fileName);
Я вижу несколько ошибок:
- Вы подключаетесь к частному слоту в
parentClass
отchildClass
Вы должны сделать его публичным, если хотите подключить его. - Вы подключаете сигнал к слоту с другой функцией подписи. Ваш сигнал имеет тип параметра
int
и тип слотаQString*
, Функции должны иметь одинаковый тип параметров. - В вашем подключении вы ссылаетесь использовать тип параметра
QString*
в вашем слоте, но вparentClass
тип параметраQString
,
Для получения дополнительной информации о сигналах и слотах см.: Сигналы и слоты.
PS: ваше имя childClass
а также parentClass
тоже не ясно, так как они оба наследуют от QObject
, Смотрите наследование C++.