我有以下课程:
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方法中,我希望小部件像这样初始化信号槽连接:
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,是派生子类的基类,用于指定具体的数据导入器类型。 它的工作原理如下:如果我按下一个按钮,就会创建一个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 :(得分:0)
不要从子对象创建连接,而是在创建子对象后从父对象代码创建连接。 这样你就不需要施放任何类型。
答案 1 :(得分:0)
您没有展示大量重要代码(例如创建DataImporterWidget
,将MainWindow
设置为其父级,即您调用initConnections
的地方...)。但是,你说
如果我使用新的信号槽语法,我的程序崩溃了 分段错误...
如果它崩溃了,你必须找到原因。使用旧的信号槽连接语法不能治愈疾病,它只是延迟其表现。根据{{3}},您获得段错误的原因可能是parentWidget() == nullptr
或parent
尚未初始化。
我的建议,检查您的代码,并在致电DataImporterWidget
之前创建并指定initConnections()
的父级用户。
答案 2 :(得分:0)
我发现了问题。原因是,MainWidget类包含一个QMdiArea,我添加了我的PluginWidgets。因此,当我创建PluginWidget时,我将MainWidget设置为其父级,但是只要我将它添加到QMdiArea,它也会成为QMdiSubWindow的子级。 parentWidget永远不会为null,但它是错误的...