2013-08-04 55 views
1

我有一個主窗口,其中是一個按鈕,如果按下它,它將創建一個新窗口。所以它工作正常,我的問題是,我有第二個窗口上的另一個按鈕。我想將它連接到一個插槽,但我總是得到一個錯誤連接到Qt中的SLOT

沒有這樣的插槽dbManager :: addQuestions(QString的(question->文本()))

這是我要連接

void WindowManager::addQuestionDialog(){ 
... 
    question = new QLineEdit(); 
    QObject::connect(validBtn,SIGNAL(clicked()), &db, SLOT(addQuestions(QString(question->text())))); 
... 
} 

而這正是我想要conenct(CPP):

bool dbManager::addQuestions(QString& a){ 
    qDebug()<<"Connection"; 
    return true ; 
} 

.H public slots:

bool addQuestions(QString& a); 

回答

3

的問題是你試圖連接方式:試圖建立連接

QObject::connect(validBtn,SIGNAL(clicked()), &db, 
       SLOT(addQuestions(QString(question->text())))); 

的QObject :: connect()的,它實際上並沒有傳遞任何參數。所以:

SLOT(addQuestions(QString(question->text()))) 

生病了,因爲你試圖通過question-> text()作爲參數。你不能那樣做。如果你想讓這個插槽接收一個參數,那就是應該通過它的信號。所以你需要一個QString參數的信號。

有多種方法可以解決這個問題。最簡單的方法是創建一個不帶任何參數並調用addQuestions()的新插槽。例如:

void WindowManager::onValidBtnClick() 
{ 
    question = new QLineEdit(); 
    db.addQuestions(question->text())); 
} 

你連接到:

void WindowManager::addQuestionDialog() 
{ 
    // ... 
    connect(validBtn, SIGNAL(clicked()), SLOT(onValidBtnClick())); 
    // ... 
} 
+0

我怎麼能創建一個信號,它的作用就像點擊()並傳遞參數? – erbal

+0

@erbal您可以創建一個調用addQuestions()的新插槽。答案已更新。 –

+0

謝謝! :) 順便說一句,我真的不明白爲什麼我不能傳遞這樣的QString:QString(question-> text())。不應該通過問題 - >文本()作爲一個字符串? – erbal

0

我相信一個插槽應該總是返回void。你也有你的班級中的Q_OBJECT宏,並且是公開的。像這樣:

class Counter : public QObject 
{ 
    Q_OBJECT 
    int m_value; 
public: 
    int value() const { return m_value; } 
public slots: 
    void setValue(int value); 
+1

沒有爲槽返回void沒有要求。它們也可以被稱爲正常功能。例如:http://qt-project.org/doc/qt-5.1/qtwidgets/qwidget.html#close此外,你可以連接到專用插槽就好。沒有信號/插槽連接,您就不能直接打電話給他們。 –

+0

是的,我使用Q_OBJECT宏。 – erbal

0

信號的簽名和插槽的簽名必須匹配才能正確連接它們。 調試信號和槽一個有用的博客條目:http://samdutton.wordpress.com/2008/10/03/debugging-signals-and-slots-in-qt/

From the documentation:

The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.) Since the signatures are compatible, the compiler can help us detect type mismatches. 

也請使用新的連接語法。這樣你可以在編譯時發現一些錯誤。