2010-04-27 7 views
1

이것은 간단한 OOP QT 질문입니다. 내 응용 프로그램은 기본 창 (QMainWindow)과 표 (QTableWidget)로 구성됩니다. 주 창에서 나는 테이블 클래스에 전달하고자하는 변수와 변수를 가지고 있으며, 테이블 클래스에서 main widnow 클래스의 메서드에 액세스하려면 어떻게해야합니까?QT를 사용하여 OOP를 구현하는 방법

mainwindow.h

class MainWindow : public QMainWindow { 
    Q_OBJECT 
private: 
    int a; 
    int b; 
    Spreadsheet *spreadsheet; 

public: 
    void set_a(int); 
    void set_b(int); 

spreadsheet.h

class Spreadsheet : public QTableWidget { 
    Q_OBJECT 

public: 
    Spreadsheet(QWidget *parent = 0); 

은 기압이 같은 스프레드 시트를 정의

spreadsheet = new Spreadsheet(this); 

내가 스프레드 시트에서 set_a을()에 액세스하고 싶습니다 .cpp ...

+0

Offtopic이지만 관련 코멘트 : QT는 실제로 객체 지향 프로그램을 작성하는 것을 매우 어렵게 만듭니다. – Adam

답변

2

Spreadsheet 개체의 parent() 메서드를 사용하여 MainWindow에 대한 포인터를 가져올 수 있습니다. 예를 들어

,

// spreadsheet.cpp 
MainWindow* mainWindow = (MainWindow*) this->parent(); 
mainWindow->set_a(123); 

물론, Spreadsheet의 생성자에 전달 된 부모 개체는이 작업을위한 당신의 MainWindow 예를해야합니다.

그러나 oscode's suggestion을 진지하게 고려해야합니다. Qt와 유사한 API를 추가로 작성해야하기 때문입니다.

+5

이러한 솔루션을 사용하면 dinamic_cast 또는 qobject_cast를 사용하는 것이 좋습니다. – VestniK

10

다른 디자인을 고려해야합니다. 코드를 단단히 연결해야합니다. 이것은 완전히 안된하지만 당신에게 아이디어를 제공

class Spreadsheet : public QTableWidget 
{ 
    Q_OBJECT 

signals: 
    void aValueChanged(int value); 
    void bValueChanged(int value); 

public: 
    void doSomething() 
    { 
     emit aValueChanged(100); 
    } 
}; 

class MainWindow : public QMainWindow 
{ 
public: 
    MainWindow() : 
     a(0), 
     b(0) 
    { 
     connect(&spreadsheet, SIGNAL(aValueChanged(int)), this, SLOT(setA(int))); 
     connect(&spreadsheet, SIGNAL(bValueChanged(int)), this, SLOT(setB(int))); 

     spreadsheet.doSomething(); 
    } 

slots: 
    void setA(int value) { a = value; } 
    void setB(int value) { b = value; } 

private: 
    Spreadsheet spreadsheet; 
    int a; 
    int b; 
}; 

다음과 같은

어쩌면 뭔가 ....

관련 문제