从信号到插槽的连接返回false

时间:2016-04-05 18:04:18

标签: c++ qt signals-slots qobject

我有以下类声明:

class nets_list : public QDockWidget
{
    Q_OBJECT

private:
    QListView * files;

public slots:
    void SelectNet(QModelIndex i);

signals:
    void NetSelected(QString t);

public:
    nets_list(QWidget * parent = nullptr);
};

在我的nets_list构造函数中的某个时刻,我想将clicked(QModelIndex)成员的files信号连接到我班级父母的NetRunner(QString)位置:< / p>

bool x1 = connect(files, SIGNAL(clicked(QModelIndex)), this, SLOT(SelectNet(QModelIndex)));
bool x2 = connect(this, SIGNAL(NetSelected(QString)), parent, SLOT(NetRunner(QString)));

SelectNet()的代码只是:

void nets_list::SelectNet(QModelIndex i)
{
    emit NetSelected(fs->fileName(i));
}

因为我只想从QString参数中提取QModelIndex,以便我可以调用父类中的插槽。

问题是第二个connect调用返回false(bool x2似乎是假的)。为什么呢?

另外:是否有更好的解决方案来连接不同参数类型的信号和插槽?我认为使用“中间”功能,例如我的SelectNet(QModelIndex)插槽是一个很好的解决方案。

修改

父类是

class MW : public QMainWindow
{
    Q_OBJECT

private:
    QMenu * net_menu;
    QMenuBar * menu_bar;

    QStackedWidget * ctrl;
    netBuilderWidget * builder;
    netTrainerWidget * trainer;
    netRunnerWidget * runner;

    nets_list * nets_dock;

public slots:
    void netBuilder();
    void netTrainer();
    void netRunner(QString t);

    void addNet();

public:
    MW();
    QSize minimumSizeHint() const Q_DECL_OVERRIDE;
    QSize sizeHint() const Q_DECL_OVERRIDE;
};

2 个答案:

答案 0 :(得分:4)

在Qt 5中,您应该使用新的连接语法,以便在编译时捕获此类问题。

您的代码应为:

// C++11
auto conn = connect(this, &nets_list::netSelected, parent, &MW:netRunner);
// C++03
QMetaObject::Connection conn = connect(this, &nets_list::netSelected, parent, &MW:netRunner);

请注意conn不是bool,尽管它可以在需要一个的上下文中使用。

  

是否有更好的解决方案来连接具有不同参数类型的信号和插槽?

是。 C ++ 11 lambdas。例如,假设您想将void Source::aSignal(int)QLabel::setText(QString)联系起来(暂时忽略QLabel::setNum):

connect(source, &Source::aSignal, this, [this](int param){
  label.setText(QString::number(param));
});

答案 1 :(得分:2)

替换

SLOT(NetRunner(QString))

SLOT(netRunner(QString))

并且连接应该有效。