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、クリアしていない新しいシグナルマッパーを作成しています-その結果、メモリリークが発生します。
  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. parentClassからのプライベート スロットにchildClass接続しています。接続する場合は、パブリックにする必要があります。
  2. 別の関数シグネチャを使用して信号をスロットに接続します。あなたの信号にはパラメータ typeintと slot typeがありQString*ます。関数は同じタイプのパラメーターを共有する必要があります。
  3. 接続QString*では、スロットでパラメータ タイプを使用することを参照していますがparentClass、パラメータ タイプはQStringです。

シグナルとスロットの詳細については、Signals & Slotsを参照してください。

PS: と の命名はどちらも から継承されているため明確ではありませchildClassん。C++ の継承を参照してください。parentClassQObject

于 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 に答える