我有以下类声明:
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 回答
这是Qt 5,您应该使用新的连接语法,以便在编译时捕获此类问题 .
您的代码应为:
请注意
conn
不是bool
,尽管它可以在需要一个的上下文中使用 .是 . C 11 lambdas . 例如,假设您想将
void Source::aSignal(int)
连接到QLabel::setText(QString)
(暂时忽略QLabel::setNum
):更换
同
连接应该工作 .