开发者

how to implement OOP using QT

开发者 https://www.devze.com 2022-12-28 03:16 出处:网络
this is a simple OOP QT question. my app consists of main window (QMainWindow) and a table (QTableWidget).

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

cl开发者_如何学JAVAass 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...


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.


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 oscode's suggestion, since it also points you towards creating a more Qt-like API.

0

精彩评论

暂无评论...
验证码 换一张
取 消