使用 QSignalMapper 将 QString 传递给 parent 的 class 方法

Passing a QString to a class method of parent with QSignalMapper

我有一个 parent class 及其方法来更改某些信号上的标签图片。例如。当 QComboBox 中发生某些事情时... (valueChanged, activated)

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

然后我有这个 child:

    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. 的专用插槽
  3. 您每次调用 readCombo 时都在创建一个新的信号映射器,您没有清除它 - 导致内存泄漏。
  4. 多次调用 connect 会创建多个连接,即您将使用单个信号多次调用同一个插槽。

从您的示例代码中,我看到您可以通过制作 parentClass 插槽 public 或向 childClass 添加一个信号并在 parentClass.

其他选项是像这样更改 readCombo

QString imageFileName = xmlreader->attributes().value("image").toString();
parentClass->changePicture(imageFileName);

和你的 parent class 作为

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 中的专用插槽,如果要连接它,您应该将其设置为 public。
  2. 您将信号连接到具有另一个函数签名的插槽。您的信号具有参数类型 int 和插槽类型 QString*。这些函数应该共享相同类型的参数。
  3. 在您的连接中,您指的是在您的插槽中使用参数类型 QString*,但在 parentClass 中,参数类型是 QString

有关信号和槽的更多信息,请参阅:Signals & Slots

PS:你对childClassparentClass的命名也不明确,因为它们都继承自QObject。参见 C++ inheritance

好的,知道了:

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