2010-04-27 82 views
1

這是一個簡單的OOP QT問題。 我的應用程序由主窗口(QMainWindow)和一個表格(QTableWidget)組成。 在主窗口中我有參數和變量,我想傳遞給表類,並從表類中訪問主要的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

外觀但相關的評論:QT實際上使得它非常困難不寫一個面向對象的程序 – Adam 2010-05-13 05:59:38

回答

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 2010-04-27 20:47:02

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

這是完全未經測試,但給你一個想法。