我使用Qt进行项目,我制作了一个QWidget,它运行正常。在我的widget类中,我有3个方法,Quiz是我的窗口, -
void Quiz::appendConsole(QString string) {
ui->console->append(string);
}
void Quiz::setInput(QString string) {
ui->input->setText(string);
}
QString Quiz::getInput() {
return ui->input->text();
}
并且在标题类中,它们被列为公共 - 如图所示 -
namespace Ui {
class Quiz;
}
class Quiz : public QWidget
{
Q_OBJECT
public:
Quiz(QWidget *parent = 0);
~Quiz();
void appendConsole(QString string);
void setInput(QString string);
QString getInput();
private slots:
void on_button_clicked();
void on_input_returnPressed();
private:
Ui::Quiz *ui;
};
但是当我尝试从另一个类中访问这三个方法中的任何一个时,它会因错误而失败 - error:在没有对象参数的情况下调用非静态成员函数
void startQuiz() {
Quiz::setInput("Hello");
}
有没有人知道访问这些类的正确方法或应该如何设置这些类?
答案 0 :(得分:1)
您尝试静态调用函数,即使它不是静态函数。您需要一个对象来调用此函数。将Quiz
对象传递给其他类,或使用信号。
选项1:将Quiz
的引用传递给您的其他类
#include <QWidget>
#include <QLabel>
#include <QLayout>
class Quiz : public QWidget
{
Q_OBJECT
public:
Quiz(QWidget *parent = 0) : QWidget(parent) {
setLayout(new QVBoxLayout);
label = new QLabel;
layout()->addWidget(label);
resize(400, 400);
}
void setInput(const QString &input) {
label->setText(input);
}
private:
QLabel *label;
};
class OtherClass : public QObject
{
Q_OBJECT
public:
OtherClass(QObject *parent = 0) : QObject(parent), quiz(0) {}
void setQuiz(Quiz *quiz_ptr) {quiz = quiz_ptr;}
void startQuiz() {
if(quiz)
quiz->setInput("Hello");
}
private:
Quiz *quiz;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Quiz quiz;
OtherClass otherClass;
otherClass.setQuiz(&quiz);
quiz.show();
otherClass.startQuiz();
return a.exec();
}
选项2:使用信号
#include <QWidget>
#include <QLabel>
#include <QLayout>
class Quiz : public QWidget
{
Q_OBJECT
public:
Quiz(QWidget *parent = 0) : QWidget(parent) {
setLayout(new QVBoxLayout);
label = new QLabel;
layout()->addWidget(label);
resize(400, 400);
}
public slots:
void setInput(const QString &input) {
label->setText(input);
}
private:
QLabel *label;
};
class OtherClass : public QObject
{
Q_OBJECT
public:
OtherClass(QObject *parent = 0) : QObject(parent) {}
void startQuiz() {
emit changeInput("Hello");
}
signals:
void changeInput(const QString &input);
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Quiz quiz;
OtherClass otherClass;
QObject::connect(&otherClass, &OtherClass::changeInput, &quiz, &Quiz::setInput);
quiz.show();
otherClass.startQuiz();
return a.exec();
}
答案 1 :(得分:0)
首先创建一个测验实例然后你可以调用该方法。
Quiz *quiz = Quiz();
quiz->setInput("Hello");
另一种可能性是你的意思是setInput是一个静态方法。
在这种情况下声明如下:
class Quiz : public QWidget
{
...
static setInput(QString string);
...
};