2017-08-30 42 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的父母被创建并指定。

相关问题