【问题标题】:Connection from a signal to a slot returns false [closed]从信号到插槽的连接返回 false [关闭]
【发布时间】:2016-04-05 18:04:17
【问题描述】:

我有以下类声明:

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 调用返回假(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;
};

【问题讨论】:

  • 我在任何parent 中都没有看到NetRunner 插槽?我认为您需要发布更多代码。
  • 您的父母是否有一个名为 NetRunner() 的公共插槽成员函数?
  • 是的,它在Q_OBJECT 宏之后有一个public slots: void netRunner(QString t); 声明。
  • @Thomas parent 是一个指向父对象的指针(即在其成员中具有nets_list 对象的对象)。
  • 我不确定您是否需要在连接之前将父级强制转换为您自己的类(而不是 QWidget)。

标签: c++ qt signals-slots qobject


【解决方案1】:

它是 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 lambda。例如,假设您想将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))
    

    连接应该可以工作。

    【讨论】:

    • 刚刚注意到。谢谢你,对这个愚蠢的错误感到抱歉..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多