Передача 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()) );

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

  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);

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

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

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

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

Другие вопросы по тегам