2010-04-27 8 views
1

il s'agit d'une question simple QT QT. mon application se compose de la fenêtre principale (QMainWindow) et une table (QTableWidget). dans la fenêtre principale j'ai des arguments et des variables que je voudrais passer à la classe de la table, et pour accéder aux méthodes dans la classe principale widnow de la classe de la table, comment dois-je faire?comment mettre en œuvre la POO en utilisant QT

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 définir la feuille de calcul comme ceci:

spreadsheet = new Spreadsheet(this); 

et je voudrais accéder set_a() de feuille de calcul .cpp ...

+0

Offtopic mais le commentaire pertinent: QT rend réellement très difficile de ne pas écrire un programme orienté objet – Adam

Répondre

2

Vous pouvez utiliser la méthode parent() dans l'objet Spreadsheet pour obtenir un pointeur vers votre MainWindow.

Par exemple,

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

Bien sûr, l'objet parent est passé à constructeur de Spreadsheet devrait être votre instance MainWindow pour que cela fonctionne.

Cependant, vous devriez sérieusement envisager oscode's suggestion, car il vous dirige également vers la création d'une API de type Qt plus.

+5

Avec une telle solution, mieux vaut utiliser dinamic_cast ou qobject_cast. – VestniK

10

Vous devriez envisager un design différent, vous associez étroitement votre code.

Peut-être quelque chose comme ...

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

Ceci est tout à fait non testé, mais vous donne une idée.

Questions connexes