tags:

views:

143

answers:

2

hi, this is a simple OOP QT question. my app consists of main window (QMainWindow) and a table (QTableWidget). in the main window i have arguments and variables which i would like to pass to the table class, and to access methods in main widnow class from the table class, how should i do it ?

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

atm i define Spreadsheet like this:

spreadsheet = new Spreadsheet(this);

and i'd like to access set_a() from spreadsheet.cpp...

+1  A: 

You can use the parent() method in the Spreadsheet object to get a pointer to your MainWindow.

For example,

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

Of course, the parent object passed to Spreadsheet's constructor should be your MainWindow instance for this to work.

However, you should seriously consider Steven Jackson's suggestion, since it also points you towards creating a more Qt-like API.

Veeti
With such solution you better to use dinamic_cast or qobject_cast.
VestniK
+9  A: 

You should consider a different design, you are tightly coupling your code.

Maybe something like the following...

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

This is completely untested but gives you an idea.

Steven Jackson