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

Passing a QString to a class method of parent with QSignalMapper

本文关键字:类方法 QSignalMapper QString 使用      更新时间:2023-10-16

我有一个父类及其方法来更改某些Signals上的标签图片。例如,当QComboBox中发生某些事情时。。。(值已更改,已激活)

    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),而且我找不到任何适合我的案例的好参考(在询问之前做了很多尝试和错误)

代码中的一些问题。

  1. 你真的无法连接到QObject的专用插槽
  2. 每次调用readCombo时,都要创建一个新的信号映射器,但没有清除该映射器,从而导致memleaks
  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. 您正在从childClass连接到parentClass中的专用插槽,如果要连接,则应将其设为公用插槽
  2. 将信号连接到具有另一个函数签名的插槽。您的信号具有参数类型int和插槽类型QString*。函数应该共享相同类型的参数
  3. 在您的连接中,请在插槽中使用参数类型QString*,但在parentClass中,参数类型为QString

有关信号和插槽的更多信息,请参阅:signals&插槽。

附言:您对childClassparentClass的命名也不清楚,因为它们都继承了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()) );