Qt C ++从另一个类访问窗口方法

时间:2016-05-06 11:41:05

标签: c++ qt

我使用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");
}

有没有人知道访问这些类的正确方法或应该如何设置这些类?

2 个答案:

答案 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);
    ...
};
相关问题