2016-04-05 4 views
1

У меня есть следующий класс заявление:соединения от сигнала к слоту возвращает ложь

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) в родитель моего класса:

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), было хорошим решением.

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; 
}; 
+1

Я не вижу никакого 'слота NetRunner' в любом' parent'? Я думаю, вам нужно разместить больше кода. – Thomas

+0

Есть ли у вашего родителя функция-член публичных слотов, называемая NetRunner()? –

+0

Да, у него есть 'public slots: void netRunner (QString t);' Объявление после макроса 'Q_OBJECT'. – Giorgio

ответ

2

заменить

SLOT(NetRunner(QString)) 

с

SLOT(netRunner(QString)) 

и подключения ш ould work.

+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 лямбда. Например, предположит, что вы хотите подключить void Source::aSignal(int) к QLabel::setText(QString) (игнорируя QLabel::setNum на данный момент):

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