首页 文章

从信号到插槽的连接返回false [关闭]

提问于
浏览
1

我有以下类声明:

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) 信号连接到我的类的父级中的 NetRunner(QString) 插槽:

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 ,以便我可以调用父类中的插槽 .

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

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

EDIT:

父类是

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 回答

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

    更换

    SLOT(NetRunner(QString))
    

    SLOT(netRunner(QString))
    

    连接应该工作 .

相关问题