2016-04-05 92 views
1

我有以下類聲明:連接返回false

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看起來是錯誤的)。爲什麼?

另外:是否有更好的解決方案來連接不同參數類型的信號和插槽?我認爲使用「中間」功能(例如我的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; 
}; 
+1

我沒有看到任何'NetRunner'插槽任何'parent'?我認爲你需要發佈更多的代碼。 – Thomas

+0

您的父母是否有一個名爲NetRunner()的公共插槽成員函數? –

+0

是的,它有一個'public slots:void netRunner(QString t);'''Q_OBJECT'宏後的聲明。 – Giorgio

回答

2

取代

SLOT(NetRunner(QString)) 

SLOT(netRunner(QString)) 

和連接SH會工作。

+0

剛剛發現。謝謝你,對於這個愚蠢的錯誤感到抱歉。 – Giorgio

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 lambda。例如,假設你想void Source::aSignal(int)連接到QLabel::setText(QString)(忽略QLabel::setNum了片刻):

connect(source, &Source::aSignal, this, [this](int param){ 
    label.setText(QString::number(param)); 
});