2017-08-30 59 views
0

我有以下類:沒有這樣的槽連接與父窗口部件時隙插件信號時

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); 
在該方法中initConnections

,我想微件給init信號時隙像這樣的連接:

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

導入程序是一個QGroupBox和派生子類的基類指定co隱藏數據導入器類型。 它的工作方式如下:如果我按下一個按鈕,將創建一個DataImporterWidget,並將其作爲QMdiSubWindow添加到QMdiArea中。創建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類的插槽方法中發生分段故障而崩潰。 –

回答

0

我發現了這個問題。原因是,MainWidget類擁有一個QMdiArea,我添加了PluginWidgets。所以,當我創建PluginWidget時,我將MainWidget設置爲其父項,但只要將它添加到QMdiArea中,它也會成爲QMdiSubWindow的子項。 parentWidget從來不是null,但它是錯誤的...

0

不要從子對象創建連接,而應在創建子對象後從父對象代碼創建它。 這樣你就不需要施放任何類型。

0

您沒有顯示大量重要代碼(例如創建DataImporterWidget,將MainWindow設置爲其父項,即您撥打initConnections的地方......)。不過,你說的

如果我使用新的信號槽語法,我的程序崩潰了 分段故障...

如果它崩潰了,比你必須找到一個原因。使用舊的信號槽連接語法不能治癒疾病,它只是延遲其表現。根據this,你得到段錯誤的原因可能是parentWidget() == nullptrparent尚未初始化。

在您致電initConnections()之前,我的建議是,檢查您的代碼,並讓DataImporterWidget的父母被創建並指定。

相關問題