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

标签 c++ qt

我在一个项目中使用 Qt,我制作了一个 QWidget,它运行良好。在我的小部件类中,我有 3 个方法,测验是我的窗口,-

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();
}

并且在 header 类中,它们被列为公开的,如图所示 -

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;
};

但是当我尝试从另一个类访问这三种方法中的任何一种时,它会失败并出现错误 - 错误:调用没有对象参数的非静态成员函数

void startQuiz() {
    Quiz::setInput("Hello");
}

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

最佳答案

您正在尝试静态调用函数,即使它不是静态函数。您需要一个对象来调用此函数。要么将您的 Quiz 对象传递给其他类,要么使用信号。

选项 1:Quiz 的引用传递给您的其他类(class)

#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();
}

关于c++ - Qt C++ 从另一个类访问窗口方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071477/

相关文章:

c++ - QDomDocument - 如何从 QString 创建?

Qt QAudioOutput 推送模式

c++ - gSOAP:RPC 截断 std::string 中的二进制数据

c++ - APR(Apache可移植运行时)1.2.2 RegEx?

c++ - MDI 面向对象的方法,从 MDICREATESTRUCT 检索 this 指针

c++ - 使用 QT 4.7.4 窗口显示带有 libvlc 2.1.0 的视频

linux - Qtcreator 中的调试助手在 Linux 上不起作用

c++ - 使用宏创建 Q_INVOKABLE 函数

c++ - Boost - 构建时关于取消引用指针的警告

c++ - 如何强制 Mac 窗口到前台?