我在一个项目中使用 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/