У меня есть родительский класс с его методом для изменения изображения меток на определенных сигналах. Например. Когда что-то происходит в 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), и я не могу найти какую-либо хорошую справку, которая работает для моего случая (пробная версия и ошибка много, прежде чем спрашивать)
Некоторые проблемы с вашим кодом.
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 ++.
Хорошо понял:
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()) );