1

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

没有这样的插槽 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);
4

3 回答 3

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()));
    // ...
}
于 2013-08-04T19:53:05.903 回答
0

我相信一个插槽应该总是返回无效。您的班级中是否还有带有插槽的 Q_OBJECT 宏,并且它是公共的。像这样:

class Counter : public QObject
{
    Q_OBJECT
    int m_value;
public:
    int value() const { return m_value; }
public slots:
    void setValue(int value);
于 2013-08-04T19:42:07.710 回答
0

信号的签名和插槽的签名必须匹配才能正确连接它们。用于调试信号和插槽的有用博客条目:http: //samdutton.wordpress.com/2008/10/03/debugging-signals-and-slots-in-qt/

从文档中:

 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. 

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

于 2013-08-04T19:52:47.143 回答