【发布时间】: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