2

我有一个父类,它的方法可以更改某些信号上的标签图片。例如,当 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),而且我找不到任何适合我的案例的好的参考(在询问之前做了很多试验和错误)

4

3 回答 3

2

您的代码存在一些问题。

  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);
于 2015-11-02T09:57:23.437 回答
1

我看到几个错误:

  1. 您正在连接到parentClassfrom中的一个私人插槽childClass,如果您想连接它,您应该将其公开。
  2. 您将信号连接到具有另一个函数签名的插槽。您的信号具有参数类型int和插槽类型QString*。这些函数应该共享相同类型的参数。
  3. 在您的连接中,您指的是QString*在您的插槽中使用参数类型,但在parentClass参数类型中是QString.

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

childClassPS:您对和的命名parentClass也不清楚,因为它们都继承自QObject. 请参阅C++ 继承

于 2015-11-02T10:03:26.313 回答
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()) );
于 2015-11-02T10:30:26.733 回答