2010-04-27 101 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; 
}; 

这是完全未经测试,但给你一个想法。