2013-01-05 325 views
1

我有一個按鈕,默認情況下我將其設置爲禁用。我希望每當在文本框中輸入一些文本時,該按鈕將被啓用。我想這一點:QPushButton setEnabled(true)插槽不工作

connect(ui->textEdit,SIGNAL(textChanged()),ui->pushButton,SLOT(setEnabled(true))); 

但給人以下錯誤:

Object::connect: No such slot QPushButton::setEnabled(true) 
Object::connect: (sender name: 'textEdit') 
Object::connect: (receiver name: 'pushButton') 

Qt的官方文件說,它繼承的setEnabled()槽從QWidget中 http://doc.qt.digia.com/qt/qwidget.html#public-slots

問題出在哪裏?

回答

3

你的代碼是錯誤的:

  • void QPushButton::setEnabled(bool);不是Qt的插槽。
  • 通過static void QObject::connect(const QObject *, const char *, const QObject *, const char *);方法連接的信號和插槽必須得到相同的簽名。在這裏你得到一個帶有「blablablaSlot(bool);」插槽的「blablablaSignal(void);」信號。
  • 連接插槽時,您不能傳遞參數。
  • void QLineEdit::textChanged(void);信號不存在,不像void QLineEdit::textChanged(const QString &);

所以,你的代碼有更好的看起來像這樣:

#include <QLineEdit> 
#include <QObject> 
#include <QPushButton> 

class UIBuilder { 

    public: 

     UIBuilder() : textEdit(new QTextEdit()), pushButton (new QPushButton()) 
     { 
      // Do your stuff 
      QObject::connect(textEdit, SIGNAL(textChanged(const QString &)), 
          this, SLOT(enableSlot(const QString &))); 
     } 

     ~UIBuilder() 
     { 
      delete textEdit; 
      delete pushButton; 
     } 

    protected: 
     QLineEdit * textEdit; 
     QPushButton * pushButton; 

    public slots: 

     void enableSlot(const QString &) 
     { 
      pushButton->setEnabled(true); 
     } 
}; 

PS:我猜你使用QLineEdit的文本。