使用QSignalMapper将QString传递给父类的类方法

时间:2015-11-02 09:27:32

标签: c++ qt 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 SignalNo such Slot或大写Incompatiple sender/receiver arguments

我很感激这方面的一些帮助,因为语法真的不直观(imo),我找不到任何适用于我的案例的好参考(在询问之前做了很多试验和错误)< / p>

3 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。

  1. 您真的无法连接到QObject
  2. 的私人广告位
  3. 每次拨打readCombo时,您都会创建一个新的信号映射器,而这些信号映射器不会被清除 - 这会导致memleaks。
  4. 多次调用connect会创建多个连接,即您将使用单个信号多次调用同一个插槽。
  5. 从您的示例代码中,我看到您可以通过将parentClass广告位公开或向childClass添加信号并在parentClass中与其连接来解决此问题。< / p>

    其他选项是更改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 :(得分:1)

我看到几个错误:

  1. 您正在从parentClass childClass连接到私人广告位,如果要连接,则应将其公开。
  2. 使用其他功能签名将信号连接到插槽。您的信号的参数类型为int,插槽类型为QString*。这些函数应该共享相同类型的参数。
  3. 在您的连接中,您可以使用插槽中的参数类型QString*,但在parentClass中,参数类型为QString
  4. 有关信号和广告位的详细信息,请参阅:Signals & Slots

    PS:childClassparentClass的命名不明确,因为它们都是从QObject继承的。请参阅C++ inheritance

答案 2 :(得分:0)

好的,明白了:

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