连接到Qt中的SLOT

时间:2013-08-04 19:36:35

标签: qt

我有一个主窗口,其中是一个按钮,如果按下则会创建一个新窗口。所以它工作正常,我的问题是我在第二个窗口上有另一个按钮。我想将它连接到一个插槽,但我总是遇到错误

  

没有这样的插槽dbManager :: addQuestions(QString(question-> text()))

这是我想要连接的地方

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

这就是我想要联系的地方(cpp):

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

.H 公共插槽:

   bool addQuestions(QString& a);

3 个答案:

答案 0 :(得分:3)

问题在于您尝试连接的方式:

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

QObject :: connect()尝试建立连接,它实际上并不传递任何参数。所以:

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

生成错误,因为您试图将问题&gt; text()作为参数传递。你不能这样做。如果你想让插槽接收一个参数,那就是应该传递它的信号。所以你需要一个带有QString参数的信号。

有多种方法可以解决这个问题。最简单的方法是创建一个不带任何参数的新槽,并调用addQuestions()。例如:

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

你连接到那个:

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

答案 1 :(得分: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);

答案 2 :(得分: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. 

另请使用新的连接语法。这样你就可以在编译时发现一些错误。