我有以下类声明:
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;
};
答案 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))
并且连接应该有效。