2016-05-06 10 views
0

私はプロジェクトにQtを使っていましたが、私はQWidgetを作成しました。私のウィジェットクラスでは、私は3つの方法があり、クイズは、私の窓である -Qt C++別のクラスのウィンドウメソッドにアクセスする

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

しかし、私はこれらのいずれかにアクセスしようとすると、それはエラーで失敗し、別のクラスからの三つの方法 - エラー:オブジェクト引数

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

せずに非静的メンバ関数を呼び出して、誰もがアクセスもに適切な方法を知っているんこれらのクラス、またはこれらのクラスの設定方法を教えてください。

+0

待ち信号を使用します**メソッドを呼び出す際のエラーですが、**メソッド**を呼び出す方法を表示することが重要だったとは思わなかったのですか?どうして? –

+0

寒い人もいます。 – Hamish

+1

「Quiz :: setInput」は静的メソッドではないので、オブジェクトなしで呼び出すことはできません。 'Quiz'オブジェクトを他のクラスに渡すか、シグナルを使用します。 – thuga

答えて

0

まず、クイズのインスタンスを作成し、メソッドを呼び出すことができます。

Quiz *quiz = Quiz(); 
quiz->setInput("Hello"); 

他の可能性は、setInputが静的メソッドであることを意味します。その場合には

はこのように宣言:

class Quiz : public QWidget 
{ 
    ... 
    static setInput(QString string); 
    ... 
}; 
+0

私にエラーが表示されます: 'Quiz'から 'Quiz *'への実行可能な変換はありません – Hamish

+0

ここでは少なくとも新しいQuiz()が必要です。 – alediaferia

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(); 
} 
関連する問題