2017-08-30 8 views
0

でウィジェットの信号を接続するとき、私は次のクラスがあります:メソッドのinitConnectionsでないようなスロット親ウ​​ィジェットスロット

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QStringList pluginsToStart, QWidget *parent = 0); 
    ~MainWindow(); 

// some other stuff 

public slots: 
    void on_timeDataChanged(logging::TimeValueVector<bool>& aData); 
    void on_importStarted(); 
} 

class DataImporterWidget : public PluginWidget 
{ 
    Q_OBJECT 

public: 
    explicit DataImporterWidget(QWidget *parent = 0); 
    ~DataImporterWidget(); 

    void initConnections(QMap<QString, PluginWidget*> pluginWidgetMap); 

を、私は、ウィジェットがシグナル・スロットを初期化したいです

void DataImporterWidget::initConnections(QMap<QString, PluginWidget*> pluginWidgetMap) 
{ 
    for(Importer* importer : this->getImporterMap().values()) 
    { 
     connect(importer, SIGNAL(signal_timeDataChanged(logging::TimeValueVector<bool>&)), 
      parentWidget(), SLOT(on_timeDataChanged(logging::TimeValueVector<bool>&))); 
    } 

    connect(this, SIGNAL(signal_importStarted()), parentWidget(), SLOT(on_importStarted())); 
} 

ImporterはQGroupBoxであり、coGroup ncreteデータインポータタイプ。 これは次のように機能します:ボタンを押すと、DataImporterWidgetが作成され、QMdiAreaにQMdiSubWindowとして追加されます。 DataImporterWidgetを作成するときは、シグナルスロット接続を設定するinitConnections()メソッドを呼び出します。

QObject::connect: No such slot 
QMdiSubWindow::on_timeDataChanged(logging::TimeValueVector<bool>&) in src/dataimporter/DataImporterWidget.cpp:81 
QObject::connect: No such slot QMdiSubWindow::on_importStarted() in src/dataimporter/DataImporterWidget.cpp:85 
QObject::connect: (sender name: 'DataImporterWidget') 

スロットがあるので、私はそれを得るなぜ私は理解していない:私はプログラムを実行するとき

は今、私は、次のメッセージが表示されます。 parentWidgetをMainWindowにキャストしても、同じエラーが発生します。

PluginWidgetは、使用しているプラ​​グインのいくつかの共通機能を保持するQWidgetから派生した基本クラスです。 Q_OBJECTを各ベースクラスと派生クラスに配置しましたが、このエラーが発生します。しかし、MainWindowで接続を設定するとうまくいきますが、なぜ上記の解決法はうまくいかないのでしょうか?

+0

'parentWidget'は' MainWindow'型ではないようです。 – m7913d

+1

これは、Qt 5で導入された[new signal slot syntax](https://wiki.qt.io/New_Signal_Slot_Syntax)の使用を開始するのに適しています。この方法で、コンパイル時により明確なエラーが発生します。 – MrEricSir

+0

新しい信号スロットの構文を使用すると、MainWindowクラスのslotメソッドのセグメンテーション違反でプログラムがクラッシュします。 –

答えて

0

問題が見つかりました。理由は、MainWidgetクラスがQMdiAreaを保持していて、PluginWidgetsを追加するからです。したがって、PluginWidgetを作成すると、MainWidgetをその親として設定しますが、QMdiAreaに追加すると同時にQMdiSubWindowの子になります。 parentWidgetはnullではありませんでしたが、間違ったものでした...

0

子オブジェクトから接続を作成しないでください。代わりに、子オブジェクトを作成した後に親オブジェクトコードから作成してください。 このように、任意の型をキャストする必要はありません。

0

重要なコードが表示されませんでした(DataImporterWidgetを作成し、MainWindowを親とし、initConnectionsと呼ぶ場所など)。しかし、私は新しい信号スロットの構文を使用している場合は、それがクラッシュした場合、私のプログラムは、あなたが理由を見つけるために持っているよりも、... セグメンテーションフォールトで

をクラッシュ

を言いました。古いシグナルスロットの接続構文を使用しても病気が治癒するわけではなく、その症状を遅らせるだけです。 thisによれば、segfaultを取得する理由はparentWidget() == nullptrまたはparentになりますが、まだ初期化されていません。

私の助言、あなたのコードをチェックし、DataImporterWidgetの親をあなたの電話の前に作成して指定してくださいinitConnections()

関連する問題