从信号到槽的连接 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));
});
我有以下 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.
问题是第二个 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));
});