首页 文章

将小部件信号与父小部件插槽连接时没有这样的插槽

提问于
浏览
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中,我希望小部件初始化信号槽连接,如下所示:

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中设置连接,它可以正常工作,但我想知道为什么上述解决方案不起作用 .

3 回答

  • 0

    不要从子对象创建连接,而是在创建子对象后从父对象代码创建它 . 这样您就不需要投射任何类型 .

  • 0

    您没有显示大量重要代码(例如创建 DataImporterWidget ,将 MainWindow 设置为其父级,即您调用 initConnections 的位置...) . 但是,你说

    如果我使用新的信号槽语法,我的程序崩溃时出现分段错误...

    如果它崩溃了,你必须找到原因 . 使用旧的信号槽连接语法不能治愈疾病,它只是延迟其表现 . 根据this,你得到段错误的原因可能是 parentWidget() == nullptrparent 尚未初始化 .

    我的建议,检查你的代码,并在调用 initConnections() 之前创建并指定用户 DataImporterWidget 的父级 .

  • 0

    我发现了这个问题 . 原因是,MainWidget类包含一个QMdiArea,我添加了我的PluginWidgets . 因此,当我创建PluginWidget时,我将MainWidget设置为其父级,但是只要我将它添加到QMdiArea,它也会成为QMdiSubWindow的子级 . parentWidget永远不会为null,但它是错误的...

相关问题