Передача 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), и я не могу найти какую-либо хорошую справку, которая работает для моего случая (пробная версия и ошибка много, прежде чем спрашивать)

2

Решение

Некоторые проблемы с вашим кодом.

  1. вы действительно не можете подключиться к частному слоту QObject
  2. Вы создаете новый маппер сигналов каждый раз, когда звоните readCombo который вы не очищаете — в результате чего возникает утечка памяти.
  3. призвание 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);
2

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

Я вижу несколько ошибок:

  1. Вы подключаетесь к частному слоту в parentClass от childClassВы должны сделать его публичным, если хотите подключить его.
  2. Вы подключаете сигнал к слоту с другой функцией подписи. Ваш сигнал имеет тип параметра intи тип слота QString*, Функции должны иметь одинаковый тип параметров.
  3. В вашем подключении вы ссылаетесь использовать тип параметра QString* в вашем слоте, но в parentClass тип параметра QString,

Для получения дополнительной информации о сигналах и слотах см .: сигналы & игровые автоматы.

PS: ваше имя childClass а также parentClass тоже не ясно, так как они оба наследуют от QObject, Увидеть Наследование C ++.

1

Хорошо понял:

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()) );
0
По вопросам рекламы [email protected]