从信号到槽的连接 returns false

Connection from a signal to a slot returns false

我有以下 class 声明:

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 构造函数中的某个时刻,我想将 files 成员的 clicked(QModelIndex) 信号连接到我 class:

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

因为我只想从QModelIndex参数中提取一个QString,这样我就可以在父class.

中调用slot

问题是第二个 connect 调用 returns false(bool x2 似乎是 false)。为什么?

另外:对于连接不同参数类型的信号和槽,有没有更好的解决方案?我认为使用 "intermediate" 函数(例如我的 SelectNet(QModelIndex) 槽)是一个很好的解决方案。

编辑:

父class是

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

替换

SLOT(NetRunner(QString))

SLOT(netRunner(QString))

并且连接应该可以正常工作。

这是 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,尽管它可以用在需要一个的上下文中。

is there a better solution for connecting signals and slots with different parameter types?

是的。 C++11 拉姆达表达式。例如,假设您想将 void Source::aSignal(int) 连接到 QLabel::setText(QString)(暂时忽略 QLabel::setNum):

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