我有一个主窗口,其中是一个按钮,如果按下则会创建一个新窗口。所以它工作正常,我的问题是我在第二个窗口上有另一个按钮。我想将它连接到一个插槽,但我总是遇到错误
没有这样的插槽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);
答案 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/
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.
另请使用新的连接语法。这样你就可以在编译时发现一些错误。