2017-08-30 10 views
0

Je les classes suivantes:Une telle fente lors de la connexion signal de widget avec fente widget parent

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

et

class DataImporterWidget : public PluginWidget 
{ 
    Q_OBJECT 

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

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

dans la méthode initConnections, je veux le widget pour initialiser le signal fente connexions comme ceci:

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

Importateur est un QGroupBox et une classe de base pour les sous-classes dérivées spécifiant co ncrete types d'importateurs de données. Cela fonctionne comme suit: Si j'appuie sur un bouton, un DataImporterWidget est créé et ajouté à un QMdiArea en tant que QMdiSubWindow. Lors de la création de DataImporterWidget, j'appelle la méthode initConnections() qui configure les connexions de slot de signal.

Maintenant, quand je lance le programme, je reçois le message suivant:

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

Je ne comprends pas pourquoi je reçois parce que l'emplacement est là. Même si je jette le parentWidget à la MainWindow, j'obtiens la même erreur. PluginWidget est juste une classe de base dérivant de QWidget qui contient des fonctionnalités communes pour mes plugins utilisés. Je mets Q_OBJECT sur chaque base et classe dérivée mais j'obtiens toujours cette erreur. Cependant, si je configure les connexions dans MainWindow, cela fonctionne très bien, mais je me demande pourquoi la solution ci-dessus ne fonctionnera pas.

+0

'parentWidget' ne semble pas être de type' MainWindow'. – m7913d

+1

Ce serait le bon moment pour commencer à utiliser la [nouvelle syntaxe de fente de signal] (https://wiki.qt.io/New_Signal_Slot_Syntax) introduite dans Qt 5; De cette façon, vous obtiendrez une erreur plus claire au moment de la compilation. – MrEricSir

+0

Si j'utilise la nouvelle syntaxe d'emplacement de signal, mon programme se bloque avec une erreur de segmentation dans la méthode slot de la classe MainWindow. –

Répondre

0

J'ai trouvé le problème. La raison en est que la classe MainWidget contient une QMdiArea dans laquelle j'ajoute mes PluginWidgets. Ainsi, quand je crée le PluginWidget, je place le MainWidget comme parent, mais dès que je l'ajoute à QMdiArea, il devient aussi un enfant de QMdiSubWindow. Le parentWidget n'était jamais nul mais c'était le mauvais ...

0

Ne créez pas la connexion à partir d'un objet enfant, mais créez-la à partir du code objet parent après avoir créé l'objet enfant. De cette façon, vous n'aurez besoin de lancer aucun type.

0

Vous n'avez pas montré un gros morceau de code important (comme créer DataImporterWidget, en définissant MainWindow comme son parent, l'endroit où vous appelez initConnections ...). Cependant, vous avez dit

Si j'utilise la nouvelle syntaxe de l'emplacement du signal, mon programme se bloque avec une erreur de segmentation ...

Si elle tombe en panne, que vous devez trouver une raison. L'utilisation de l'ancienne syntaxe de connexion de slot de signal ne guérit pas la maladie, elle retarde juste sa manifestation. Selon this, la raison pour laquelle vous obtenez un segfault peut être parentWidget() == nullptr ou parent n'est pas encore initialisée.

Mon conseil, vérifiez votre code, et faites en sorte que l'utilisateur du parent DataImporterWidget soit créé et spécifié avant votre appel initConnections().